// ult link cleaner
YAHOO.ULT = {};
YAHOO.ULT.CONF = { cleanest: 1 };


/**
 * Library of global members for Yahoo! Local 
 * @requires YUI yahoo, event, dom
 */


YAHOO.namespace("Local.util");


/**
 * @constant {String} YMAPPID: required for internal use of ajax api. 
 */
var YMAPPID = "ylocal";


/**
 * Adds the prefill input event and ulm dropdown event.
 *     - Positions the ULM button
 *     - Sets the height of the ULM button (for browser compatibility reasons)
 * @method handleUlmButton 
 */
YAHOO.Local.handleUlmButton = function(formEl, ulmEl) {
    if (YAHOO.lang.isUndefined(formEl)) {
        return;
    }
    var elToFill = formEl.getElementsByTagName('input')[1];
    //check for the new header
    var localHeader2 = YAHOO.util.Dom.get('ygma2');

    var ulmRegion = YAHOO.util.Dom.getRegion(elToFill);

    if(localHeader2){
        //YAHOO.util.Dom.setXY(ulmEl, [ulmRegion.right-18, ulmRegion.top+3]);
        //not moving the button anymore, moved in position by CSS because of IE6 bug
    }else { 
        YAHOO.util.Dom.setXY(ulmEl, [ulmRegion.right - 17, ulmRegion.top + 2]);
        var inputHeight = elToFill.offsetHeight - 4;
        YAHOO.util.Dom.setStyle(ulmEl, 'height', inputHeight + 'px');
    }
    YAHOO.util.Event.on(ulmEl, 'click', function(e) {
        YAHOO.util.Event.stopPropagation(e);
        var el = YAHOO.util.Event.getTarget(e);
        //preventDefault is not working with ULM <BUTTON> so we will do additional
        //checking so when user clicks ENTER key it does not popup Ulm dropdown.
        if (!YAHOO.util.Dom.hasClass(el, 'yls-gl-ulmbtns')) {
            return false;
        } else {
            //prevent default on the ulm button
            YAHOO.util.Event.preventDefault(e);
        }

        if (!YAHOO.util.Dom.inDocument('yulm') && !YAHOO.util.Dom.inDocument('yls-gl-inprogcont')) {
            YAHOO.Local.util.InProgress.create(YAHOO.Local.data.IN_PROGRESS, elToFill);
        }
        if (!YAHOO.lang.isObject(YAHOO.Local.Ulm)) {
            var arrUrls = [YAHOO.Local.data.ULM.js, YAHOO.Local.data.ULM.css];
            if (!YAHOO.lang.isObject(YAHOO.util.Connect)) {
                arrUrls.push(YAHOO.Local.data.YUI.connection);
            }
            var file = new YAHOO.Local.util.loadFile(arrUrls, 'YAHOO.Local.Ulm');
            file.onComplete.subscribe(function(){
                YAHOO.Local.Ulm.init(elToFill);
            });
        } else {
            YAHOO.Local.Ulm.init(elToFill);
        }
    });
};




/**
 * Handles the toggle's 'more' link 
 * @method handleMoreToggle
 */
YAHOO.Local.handleMoreToggle = function(e) {
    YAHOO.util.Event.preventDefault(e);
    var moreList = YAHOO.util.Dom.getElementsByClassName('yls-gl-tog')[0].getElementsByTagName('ul')[0];
    var show = function(b) {
        if (b) {
            YAHOO.util.Dom.setStyle(moreList, 'display', 'block');
        } else {
            YAHOO.util.Dom.setStyle(moreList, 'display', 'none');
        }
    };

    YAHOO.util.Event.on(document.body, 'click', function(e) { 
        var el = YAHOO.util.Event.getTarget(e);
        if (el.id != 'yls-gl-togmore') { show(false); }
    });

    var region = YAHOO.util.Dom.getRegion('yls-gl-togmore');
    var coords = [region.left, region.bottom];
    (YAHOO.util.Dom.getStyle(moreList, 'display') === 'none') ? show(true) : show(false);
    YAHOO.util.Dom.setXY(moreList, coords);
};




/**
 * Normalizes textContent. 
 * @method textContent 
 * @param {HTMLElement} el: The node to get or set the text content  
 * @param {String} text (optional): The text to set 
 * @return {String} The text content 
 */ 
 /********************** NOT BEING USED
YAHOO.Local.util.textContent = function (el, text) {
    if(typeof text == 'string') { //set textContent
        if(typeof el.textContent != 'string') { 
            el.innerText = text;
        } else { 
            el.textContent = text;
        }
    } else { //get textContent
        var method = null; 
        if(typeof el.textContent != 'string') { 
            method =  el.innerText;
        } else { 
            method = el.textContent;
        } 
        return method; 
    }   
};
**************************************/


/**
* Loads a script or link node into DOM
* <p>
* Usage: 
* myFile = new YAHOO.Local.util.loadFile(
* { 
*     [['1.css', ''],['2.js', 'yls-rs-refinejs'],['3.js', 'yls-dt-sendtophonejs']],
*     'YAHOO.Local.SendToPhone',
*     document.body
* );
* myFile.onComplete.subscribe(function() { //do something } );
* </p>
* @constructor
* @param {String | Array} urls: Accepts a url string, an Array of urls, or a two-dimensional Array [url, DOM Id].
* @param {String} name: The name to evaluate before firing custom onComplete event.
* @param {Object} parent (optional): The HTML element to append the script. Defaults to head tag.
*/
YAHOO.Local.util.loadFile = function(urls, name, parent) {

    this.urls = urls;
    this.name = name;
    this.parent = parent || document.getElementsByTagName('head')[0];

    this.object = null;
    this.delay = 50; //milliseconds
    this.timeOut = 20000; //milliseconds
    this.intAttempts = 0;
    this.intervalId = null;

    if (YAHOO.lang.isString(urls)) {
        this.urls = [arguments[0]];
    } else if (urls[0].length == '2') {
        this.hasIds = true;
    }

    this.stackCount = this.urls.length;
    this.load();
};

YAHOO.Local.util.loadFile.prototype = {

    onComplete: new YAHOO.util.CustomEvent('complete'), 

    load: function() {
        var self = this;
        var node = null;
        for(var i = 0; i < this.urls.length; i++){
            if (YAHOO.lang.isBoolean(this.hasIds)) {
                arrFiles = this.urls[i][0];
            } else {
                arrFiles = this.urls[i];
            }
            var type = arrFiles.substr(arrFiles.length - 3);
            if (type == '.js') {
                    node = document.createElement('script');
                    node.src = arrFiles;
            } else {
                    node = document.createElement('link');
                    node.href = arrFiles;
                    node.setAttribute('rel','stylesheet');
            }
            if (this.hasIds) {
                node.id = this.urls[i][1];
            }
            this.parent.appendChild(node);
        }
        this.intervalId = setInterval(
            function() {
                self.evaluate();
                self.poll(); 
            }, 
            this.delay
        );
    },

    evaluate: function() {
        var d = this.name.split("."), o = null;
        for (var i = 1, o = window[d[0]]; i < d.length; i++) {
            o = o[d[i]];
        }
        this.object = o;
        return this.object;
    },

    poll: function() {    
        if (YAHOO.lang.isObject(this.object) || YAHOO.lang.isFunction(this.object)) {
            this.success();
        //} else if (this.intAttempts > this.timeOut / 1000) {
          //  this.failure();
        //} else {
          // this.intAttempts = this.intAttempts + 1;
        }
    },

    failure: function() {
        this.reset();
        throw new Error('Timed out. Unable to locate object: ' + this.name);
    },

    success: function() {
        this.reset();
        this.onComplete.fire();
        this.onComplete.unsubscribeAll();
    },

    reset: function() {
        clearInterval(this.intervalId);
        this.intAttempts = 0;
    }
};



/**
 * In progress container for showing animated 'spinner' and message.
 * @class InProgress
 */
YAHOO.Local.util.InProgress = {
    /**
     * Creates the 'In Progress' container 
     * @method create
     * @param message {String}: The text content in the container
     * @param target {String | HTML Element}: The target element to position the 'In Progress' container to.
     */
    create: function(message, target) {

        var container = document.createElement('div');
        container.id = 'yls-gl-inprogcont';
        container.innerHTML = '<button id="yls-gl-inprogclose">close</button>';
	if(YAHOO.util.Dom.inDocument('yls-gl-pg')) {
            YAHOO.util.Dom.get('yls-gl-pg').appendChild(container);
        } else {
	    document.body.appendChild(container);
        }

        var img = document.createElement('img');
        img.src = 'http://l.yimg.com/a/i/us/ls/gr/i/spinner.gif';
        container.appendChild(img);
        container.innerHTML += message;

        var position = function() {
            if(YAHOO.lang.isObject(target)) {
                var xy = [YAHOO.util.Dom.getRegion(target).left, YAHOO.util.Dom.getRegion(target).bottom];
                YAHOO.util.Dom.setXY('yls-gl-inprogcont', xy);
            }
        };

        YAHOO.util.Event.onAvailable('yls-gl-inprogcont', position);
        YAHOO.util.Event.on('yls-gl-inprogclose', 'click', this.destroy);
    },
 
    /**
     * Removes the 'In Progress' container from document. Also, removes event listener from the close button.
     * @method destroy
     */
    destroy: function() {
        if (YAHOO.util.Dom.inDocument('yls-gl-inprogcont')) {
            var _inprog = YAHOO.util.Dom.get('yls-gl-inprogcont');
            _inprog.parentNode.removeChild(_inprog);
            YAHOO.util.Event.removeListener('yls-gl-inprogclose', 'click');
            _inprog = null;
        }
    }
};


/**
 * Replaces the toggle links (&p=[a-z]) with the INPUT value in p 
 * @method toggleUrlReplacement  
 */
YAHOO.Local.toggleUrlReplacement = function() {
    var toggle = YAHOO.util.Dom.getElementsByClassName('yls-gl-tog', 'div')[0];
    var coll = toggle.getElementsByTagName('a');
    YAHOO.util.Event.on(coll, 'click', function(e) {
        var el = YAHOO.util.Event.getTarget(e);
        //get &p=[a-z]
        var regex = /(&)p=(?:.*?)(&|$)/gi;
        if (el.href.search(regex) != '-1') {
            YAHOO.util.Event.preventDefault(e);
            var newurl = el.href.replace(regex, '');
            var stx = YAHOO.util.Dom.get('p');
            var p = '';
            if (YAHOO.Local.data.SEARCH_INPUT['stx'] != stx.value) {
                p = stx.value;
            }
            var newsearch = '&p=' + p;
            location.href = newurl + newsearch;
        }
    });
};


/**
 * YUI Connection Manager wrapper  
 */ 
// same signature as YUI Connection Manager
YAHOO.Local.util.requestObject = function(sMethod, sUrl, oCallback, sData) {
    var _method, _url, _callback_obj, _data;
    if(arguments.length == 1) { // assume the only argument is a URL
        _url = arguments[0];
        _method = 'GET';
    } else {
        _url = sUrl;
        _method = sMethod;
    }
    _callback_obj = oCallback || {success:this.success, failure:this.failure, scope:this};
    _data = sData || null;

    this.conn_obj = YAHOO.util.Connect.asyncRequest(_method, _url, _callback_obj, _data);
    YAHOO.Local.util.requestObject.transactionObjects[this.conn_obj.tId] = this.conn_obj;
}

// static array of connection objects for record-keeping 
YAHOO.Local.util.requestObject.transactionObjects = [];

// default instance methods that store response history  
YAHOO.Local.util.requestObject.prototype.success = function(obj) {
    YAHOO.Local.util.requestObject.transactionObjects[obj.tId].responseText = obj.responseText;
};
YAHOO.Local.util.requestObject.prototype.failure = function(obj) {
    YAHOO.Local.util.requestObject.transactionObjects[obj.tId].statusText = obj.statusText;
};

/**
 * Strips '+' from encodedURI
 * @method decodeURI
 */
YAHOO.Local.util.decodeURI = function(enc_str) {
    enc_str = enc_str.replace(/\+/g,' ');
    enc_str = decodeURIComponent(enc_str);
    return enc_str;
};

/**
 * For CoreID State Al case, sets CoreID nickname before UGC form submission
 * To use attach this function as the form's onsubmit handler
 * @method handleCoreINoNickname
 */
YAHOO.Local.util.handleCoreIdNoNickname = function(e) {
     var self = this;

     if (typeof(self['yIdAliasSelect']) != 'undefined') {
         var _form_data = { 'yIdAliasSelect':self['yIdAliasSelect'].value, 'yIdNicknameInput':self['yIdNicknameInput'].value };
         YAHOO.Local.util.updateCoreId(self, _form_data, function(oForm, _responseData) {
             if (_responseData.status == 'OK') {
                 oForm.submit();
             } else {
                 var oIdPicker = YAHOO.util.Dom.get('yIdSignDiv');
                 var error_msgs = YAHOO.util.Dom.getElementsByClassName('yls-gl-error', 'p',  oIdPicker.parentNode);
                 var error_msg = (error_msgs.length > 0) ? error_msgs[0] : null;
                 if (YAHOO.lang.isNull(error_msg)) {
                     error_msg = document.createElement('p');
                     YAHOO.util.Dom.addClass(error_msg, 'yls-gl-error');
                     YAHOO.util.Dom.addClass(error_msg, 'yls-gl-palette1');
                     oIdPicker.parentNode.insertBefore(error_msg, oIdPicker);
                     error_msg.style.display = 'block';
                 }
                 error_msg.innerHTML = _responseData.errormsg;
             }
         });
     }
     YAHOO.util.Event.stopEvent(e);
};

/**
 * Update CoreID preference/nickname (State A)
 */
YAHOO.Local.util.updateCoreId = function(oSubmit, _form_data, handleCoreIdResp) {
    var formAction = '/coreid_update_handler.php';
    var postData = 'yIdAliasSelect=' + _form_data['yIdAliasSelect'] + '&yIdNicknameInput=' + _form_data['yIdNicknameInput'];
    var errResp = { 'status':'NOT OK', 'errmsg':'Sorry, there was a momentary error. Please try again.' };

    var handleSuccess = function(o) {
        if (o.responseText !== undefined) {
            _responseData = eval(o.responseText);
        } else {
            _responseData = errResp;
        }
        handleCoreIdResp(oSubmit,_responseData);
    };

    var handleFailure = function() {
        //throw new Error('Request to update CoreId.');
        handleCoreIdResp(oSubmit,errResp);
    };

    var callback =
    {
        success: handleSuccess,
        failure: handleFailure
    };

    var request = YAHOO.util.Connect.asyncRequest('POST', formAction, callback, postData);
};


/**
 * Handles the ghost text in the search input fields.
 * @class SearchInputValue
 */
YAHOO.Local.SearchInputValue = {
    /**
     * Clears the input fields if it contains the ghost text value.
     * @param e {Event}: The click mouse event on search input fields
     * @method clear 
     */
    clear: function(e) {
        var inputEl = YAHOO.util.Event.getTarget(e);
        if (inputEl.value === YAHOO.Local.data['SEARCH_INPUT'].stx || inputEl.value === YAHOO.Local.data['SEARCH_INPUT'].csz) {
            inputEl.value = '';
            inputEl.focus();
        }
        //YAHOO.util.Dom.removeClass(inputEl, 'yls-gl-srchform-ghost');
        this.setDefaultStyle(inputEl);
    },

    check: function(inputEl) {
        var hasError = false;
        YAHOO.util.Dom.addClass(inputEl, 'yls-gl-srchform-ghost');

        if (inputEl.value != YAHOO.Local.data['SEARCH_INPUT'].stx && YAHOO.util.Dom.hasClass(inputEl, 'yls-gl-stx')) {
            //YAHOO.util.Dom.removeClass(inputEl, 'yls-gl-srchform-ghost');
            this.setDefaultStyle(inputEl);
        }
        if (inputEl.value != YAHOO.Local.data['SEARCH_INPUT'].csz && YAHOO.util.Dom.hasClass(inputEl, 'yls-gl-csz')) {
            //YAHOO.util.Dom.removeClass(inputEl, 'yls-gl-srchform-ghost');
            this.setDefaultStyle(inputEl);
        }

        //validate when user clicks on submit button
        if (YAHOO.util.Dom.hasClass(inputEl, 'yls-gl-srchbtn')) {
             var fieldsetEl = inputEl.parentNode; 	    
            //used to check for space-key input
            var trim = function(s) {
                s.replace(/^\s*/, "");
                return s.replace(/\s*$/, "");
            };
            var input = { 
                stx: fieldsetEl.getElementsByTagName('input')[0],
                csz: fieldsetEl.parentNode.getElementsByTagName('input')[1]
            }
            if (trim(input['stx'].value) == '' || input['stx'].value == YAHOO.Local.data['SEARCH_INPUT'].stx || input['stx'].value == YAHOO.Local.data['SEARCH_INPUT'].error[0]) {
                input['stx'].value = YAHOO.Local.data['SEARCH_INPUT'].error[0];
                input['stx'].select();
                hasError = true;
                return false;
            }

            if (trim(input['csz'].value) == '' || input['csz'].value == YAHOO.Local.data['SEARCH_INPUT'].csz || input['csz'].value == YAHOO.Local.data['SEARCH_INPUT'].error[1]) {
                input['csz'].value = YAHOO.Local.data['SEARCH_INPUT'].error[1];
                input['csz'].select();
                hasError = true;
                return false;
            }

            if (!hasError) {
                var formEl = fieldsetEl.parentNode;
                formEl.submit();
            }
        }
    },

    setGhostStyle: function(inputEl) {
        YAHOO.util.Dom.setStyle(inputEl, 'color', '#999');
        //YAHOO.util.Dom.setStyle(inputEl, 'font-style', 'italic');
    },

    setDefaultStyle: function(inputEl) {
        YAHOO.util.Dom.setStyle(inputEl, 'color', '#000');
        //YAHOO.util.Dom.setStyle(inputEl, 'font-style', 'normal');
    },

    /**
     * Resets the empty input fields to ghost text. Leaves non-empty input fields alone.
     * @method reset
     */
    reset: function(e) {
        var inputEl = YAHOO.util.Event.getTarget(e);
        var data = YAHOO.Local.data['SEARCH_INPUT'];
        if (YAHOO.util.Dom.hasClass(inputEl, 'yls-gl-csz') && (inputEl.value == data['csz'] || inputEl.value == '')) {
            inputEl.value = data['csz'];
            //YAHOO.util.Dom.addClass(inputEl, 'yls-gl-srchform-ghost');
            this.setGhostStyle(inputEl);
        }

        if (YAHOO.util.Dom.hasClass(inputEl, 'yls-gl-stx') && (inputEl.value == data['stx'] || inputEl.value == '')) {
            inputEl.value = data['stx'];
            //YAHOO.util.Dom.addClass(inputEl, 'yls-gl-srchform-ghost');
            this.setGhostStyle(inputEl);
        }
    },

    setLoadValue: function(inputEl) {
        var data = YAHOO.Local.data['SEARCH_INPUT'];
        if (YAHOO.util.Dom.hasClass(inputEl, 'yls-gl-stx') && inputEl.value == '') {
            //YAHOO.util.Dom.addClass(inputEl, 'yls-gl-srchform-ghost');
            this.setGhostStyle(inputEl);
            inputEl.value = data.stx;
        }
        if (YAHOO.util.Dom.hasClass(inputEl, 'yls-gl-csz') && inputEl.value == '') {
            //YAHOO.util.Dom.addClass(inputEl, 'yls-gl-srchform-ghost');
            this.setGhostStyle(inputEl);
            inputEl.value = data.csz;
        }
        //if (inputEl.value == data.stx || inputEl.value == data.csz) {
          // this.setGhostStyle(inputEl);
           //YAHOO.util.Dom.addClass(inputEl, 'yls-gl-srchform-ghost');
        //}
    },

    init: function() {

        //search inputs
        var arrStx =YAHOO.util.Dom.getElementsByClassName('yls-gl-stx', 'input', 'yls-gl-pg');
        var arrCsz = YAHOO.util.Dom.getElementsByClassName('yls-gl-csz', 'input', 'yls-gl-pg');

        var inputEls = [ arrStx[0], arrCsz[0], arrStx[1], arrCsz[1] ];
        for (var i = 0; i < inputEls.length; i++) {
            if (inputEls[i] && YAHOO.Local.data['ERROR_PAGE']) {
                if(YAHOO.Local.data['ERROR_PAGE'] == 1) {
                    inputEls[i].value = '';
                }
                this.setLoadValue(inputEls[i]);
            }
        }
        /**
         * select() causing issues in IE
         * makes INPUT field empty and displaces footer
         **/
        var isIE = (navigator.userAgent.toLowerCase().indexOf('msie')!=-1);
        if (arrStx[0] && !isIE) {
            arrStx[0].select();
        }

        var self = this;
        YAHOO.util.Event.on(inputEls, 'keypress', function(e) {
            var inputEl = YAHOO.util.Event.getTarget(e);
            self.setDefaultStyle(inputEl);
            //YAHOO.util.Dom.removeClass('yls-gl-srchform-ghost'); 
        });

        YAHOO.util.Event.on(inputEls, 'focus', function(e) { self.clear(e); });
        YAHOO.util.Event.on(inputEls, 'blur', function(e) { self.reset(e); });

        YAHOO.util.Event.on(YAHOO.util.Dom.getElementsByClassName('yls-gl-srchbtn', 'button', 'yls-gl-pg'), 'click', function(e) {
            YAHOO.util.Event.stopEvent(e);
            var el = YAHOO.util.Event.getTarget(e);
            YAHOO.Local.SearchInputValue.check(el);
        });

    }
};


YAHOO.Local.Groups = function() {

    var _paginateCounter = 0;

    var _paginateMax = 2;

    var _startIndex = 0;


    function _renderResults(index) {
        var data = YAHOO.Local.data.GROUPS.msg;
        var groupname, tile, link, date;
        var html = '';
        for (var i = _startIndex; i < _endIndex; i++) {
            groupname = data[i].group_name;
            title = data[i].title;
            link = data[i].link;
            date = data[i].tm_ago;
            html += '<li><a href="' + link + '" class="yls-gp-title">' + title + '</a>';
            html += '<a href="' + link + '" class="yls-gp-recentdesc">' + groupname + '</a> - ' + date;
            html += '</li>';
        }

        YAHOO.util.Dom.get('yls-gp-messages').innerHTML = html;
    }

    function _removeResults() {
        var listItems = YAHOO.util.Dom.get('yls-gp-messages').getElementsByTagName('li');
        var li;
        for (var i = 0; i < listItems; i++) {
            li = YAHOO.util.Dom.get('yls-gp-messages').getElementsByTagName('li')[i];
            YAHOO.util.Dom.get('yls-gp-messages').removeChild(li);
        }
    }

    function _refreshResults() {
        _removeResults();
        _renderResults();
        _handleBtnState();
    }

    function _handleBtnState() {
        if (_paginateCounter < _paginateMax ) {
            YAHOO.util.Dom.replaceClass('yls-gp-next', 'yls-gp-off', 'yls-gp-on');
        } else {
            YAHOO.util.Dom.replaceClass('yls-gp-next', 'yls-gp-on', 'yls-gp-off');
        }

        if (_paginateCounter > 0) {
            YAHOO.util.Dom.replaceClass('yls-gp-prev', 'yls-gp-off', 'yls-gp-on');
        } else {
            YAHOO.util.Dom.replaceClass('yls-gp-prev', 'yls-gp-on', 'yls-gp-off');
        }
    }

    function _paginate(btnType) {
        if (btnType == 'yls-gp-next' && !YAHOO.util.Dom.hasClass('yls-gp-next', 'yls-gp-off')) {
            _paginateCounter = _paginateCounter + 1;
            _startIndex = _paginateCounter * 3;
            _endIndex = _startIndex + 3;
            _refreshResults();
        } else if (btnType == 'yls-gp-prev' && _paginateCounter > 0 && !YAHOO.util.Dom.hasClass('yls-gp-prev', 'yls-gp-off')) {
            _paginateCounter = _paginateCounter - 1;
            _endIndex = _startIndex;
            _startIndex = _endIndex - 3;
            _refreshResults();
        }
    }

    return {


        init: function() {
            YAHOO.util.Event.on('yls-gp-next', 'click', function(e) {
                YAHOO.util.Event.preventDefault(e);
                _paginate('yls-gp-next');
            });
            YAHOO.util.Event.on('yls-gp-prev', 'click', function(e) {
            YAHOO.util.Event.preventDefault(e);
                _paginate('yls-gp-prev');
            });
        }

    };
} ();



/**
 * Intialize the global components
 * @method initGlobalComponents 
 */
YAHOO.Local.util.initGlobalComponents = function() {


    YAHOO.Local.handleUlmButton(YAHOO.util.Dom.getElementsByClassName('yls-gl-srchform', 'form', 'doc')[0], YAHOO.util.Dom.getElementsByClassName('yls-gl-ulmbtns', 'button', 'doc')[0]);
//used in the new header
    YAHOO.Local.handleUlmButton(YAHOO.util.Dom.getElementsByClassName('yls-gl-srchform2', 'form', 'doc')[0], YAHOO.util.Dom.getElementsByClassName('yls-gl-ulmbtns', 'button', 'doc')[0]);



    if (YAHOO.util.Dom.getElementsByClassName('yls-gl-tog', 'div')[0]) {
        YAHOO.Local.toggleUrlReplacement();
    }
    YAHOO.util.Event.on('yls-gl-togmore', 'click', function(e) { YAHOO.Local.handleMoreToggle(e); });

    //search input value and add event
    YAHOO.Local.SearchInputValue.init();

    // Initiate BringIt Promo flag
    var _BringItNew = YAHOO.util.Dom.get('yls-gl-bi-new');
    if (_BringItNew) {
        YAHOO.util.Dom.setStyle(_BringItNew, 'display', 'inline');
        var targetEl = YAHOO.util.Dom.getXY('yls-gl-bi-txt');
        if (YAHOO.env.ua.webkit) { //safari
            YAHOO.util.Dom.setStyle(_BringItNew, 'margin-left', 60 + 'px');
        }
        YAHOO.util.Dom.setStyle(_BringItNew, 'top', parseInt(targetEl[1] - 10) + 'px');
    }

    if (YAHOO.Local.data.GROUPS) {
        YAHOO.Local.Groups.init();
    }

    //IP Based Location
    var iplocInput = YAHOO.util.Dom.get('yls-iploc-input');
    if(iplocInput) {
       var iplocInputValue = iplocInput.value;
       YAHOO.Local.HandleGhostText.init(iplocInput ,iplocInputValue);
       var iplocSubmit = YAHOO.util.Dom.get('yls-cc-submit');
       YAHOO.util.Event.on(iplocSubmit, 'click', function(e){
           if (iplocInput.value == iplocInputValue) {
               iplocInput.value = '';
           }
       });
    }
};

 // function to track ULT
    YAHOO.Local.util.ULTBeacon = function(data, srcSpaceId, destSpaceId){
	//For testing uncomment following line
	//YAHOO.ULT.BEACON = 'http://linktrack.corp.yahoo.com/t';
        data[YAHOO.ULT.SRC_SPACEID_KEY] = srcSpaceId;
        if(destSpaceId != undefined) {
	    data[YAHOO.ULT.DEST_SPACEID_KEY] = destSpaceId;
	}
        YAHOO.ULT.beacon_click(data.toString());
   };


/**
 * Class to add and handle ghost text to an input box.
 * Call the init method of class with parameters id of the input box and text to display as ghost
 * @class HandleGhostText
 */
YAHOO.Local.HandleGhostText = {

    /**
     * Adds event handlers for focus and blur event on input box
     * @method init
     * @param fieldId (String) id of the input box to which ghost text is to be added
     * @param ghostTxt (String) text to be displayed as ghost text.
     * @return void
     */
    init: function(fieldId , ghostTxt){
        var fieldEl  = YAHOO.util.Dom.get(fieldId);
        YAHOO.Local.HandleGhostText.addGhostText(fieldEl , ghostTxt);
        YAHOO.util.Event.on(fieldEl , 'focus' , function(e){
            YAHOO.Local.HandleGhostText.ghostTextFocusHandler(fieldEl , ghostTxt);
        });
        YAHOO.util.Event.on(fieldEl , 'blur' , function(e){
            YAHOO.Local.HandleGhostText.ghostTextBlurHandler(fieldEl , ghostTxt);
        });
    },

    /**
     * Adds ghost text to the element if its value is not equal to ghost text
     * @method addGhostText
     * @param fieldEl  (HTMLInputElement) input element to which ghost text is to be added
     * @param ghostTxt (String) text to be displayed as ghost text.
     * @retrun (Void)
     */
    addGhostText: function(fieldEl , ghostTxt) {
        if (fieldEl.value != ghostTxt) {
           YAHOO.util.Dom.setStyle(fieldEl, 'color', '#999');
           YAHOO.util.Dom.setStyle(fieldEl, 'font-style', 'italic');
           fieldEl.value = ghostTxt;
        }
    },

    /**
     * Handles the focus event.
     * @method ghostTextFocusHandler
     * @param fieldEl  (HTMLInputElement) input element to which ghost text is to be added
     * @param ghostTxt (String) text to be displayed as ghost text.
     * @retrun (Void)
     */
    ghostTextFocusHandler: function(fieldEl, ghostTxt) {
        if (fieldEl.value == ghostTxt) {
            fieldEl.value = '';
            YAHOO.util.Dom.setStyle(fieldEl, 'color', '#000');
            YAHOO.util.Dom.setStyle(fieldEl, 'font-style', 'normal');
        }
    },

    /**
     * Handles the blur event.
     * @method ghostTexTBlurHandler
     * @param fieldEl  (HTMLInputElement) input element to which ghost text is to be added
     * @param ghostTxt (String) text to be displayed as ghost text.
     * @retrun (Void)
     */
    ghostTextBlurHandler: function(fieldEl, ghostTxt) {
        var trim = function(s) {
            s.replace(/^\s*/, "");
            return s.replace(/\s*$/, "");
        };
        if (fieldEl.value == ghostTxt || trim(fieldEl.value) == '') {
            fieldEl.value = ghostTxt;
            YAHOO.util.Dom.setStyle(fieldEl, 'color', '#999');
            YAHOO.util.Dom.setStyle(fieldEl, 'font-style', 'italic');
        }
    }

};



/**
 * Yahoo Search Marketing ads in the sidebar. Clicking on the ad calls a JS popup window.
 * @class YSM
 */
YAHOO.Local.YSM = {

    popWindow: function (url, name, width, height, featureIdx) {
        var o = null, args = arguments;
        var idx = parseInt(featureIdx);
        if(!YAHOO.lang.isNumber(idx)) { idx = 0; };

        if(!YAHOO.lang.isNumber(parseInt(width))) {width = 750;};
        if(!YAHOO.lang.isNumber(parseInt(height))) {height = 500;};

        var feats = ['width=', width, ',height=', height];
        feats[feats.length] = (',scrollbars=' + ((idx & 1) ? 1 : 0));
        feats[feats.length] = (',resizable=' + ((idx & 2) ? 1 : 0));
        feats[feats.length] = (',toolbar=' + ((idx & 4) ? 1 : 0));
        feats[feats.length] = (',status=' + ((idx & 8) ? 1 : 0));
        feats[feats.length] = (',location=' + ((idx & 16) ? 1 : 0));
        feats[feats.length] = (',menubar=' + ((idx & 32) ? 1 : 0));
        if(args.length >= 6){
            feats[feats.length] = (document.layers) ? ',screenX='+args[5] : ',left='+args[5];
        }
        if(args.length >= 7){
            feats[feats.length] = (document.layers) ? ',screenY='+args[6] : ',top='+args[6];
        }
        feats = feats.join('');

        o = window.open(url, name, feats);
        if(o) { o.focus(); }
        return o;
    },

    addEvents: function() {

        var items = YAHOO.util.Dom.getElementsByClassName('yls-rs-ysm-item', 'li', 'doc');

        if(YAHOO.lang.isArray(items) && items.length > 0) {
            YAHOO.util.Dom.setStyle(items, 'cursor', 'pointer');
            var linkSponsor = function(e) {
                YAHOO.util.Event.preventDefault(e);
                var el = YAHOO.util.Event.getTarget(e);
                var li = null;
                if (el.tagName.toLowerCase() != 'li') {
                    var getLI = function() {
                        var element = el;
                        while (element.tagName.toLowerCase() != 'li') {
                            element = element.parentNode;
                        }
                        return element;
                    };
                    li = getLI();
                } else {
                    li = el;
                }
                var href = li.getAttribute('link'); //get the url from 'link=' atribute
                YAHOO.Local.YSM.popWindow(href, 'ad', 750, 500, 63);
            };

            YAHOO.util.Event.on(items, 'click', linkSponsor);
        }
    }
};


/**
 * City Search Listing with Commission Junction Tracking.
 * @class CS_CJ
 */
YAHOO.Local.CS_CJ = {

    track_click: function(target, type) {

        if (type != 'get-direction') {
            return;
        }

        if (YAHOO.lang.isObject(target)) {
            var names = target.id.split('-');
            var id = names[names.length - 1];
        }
        else {
            var id = target;
        }

        if (YAHOO.Local.data['CS_LISTINGS'][id]) {

            div = document.getElementById('yls-cs-cj-track');
            if (! div) {
                div = document.createElement('div');
                div.id = 'yls-cs-cj-track';
                document.body.appendChild(div);
            }

            img = document.createElement('img');
            img.id = 'yls-cs-cj-track-img-' + id;
            img.style.width = '1px';
            img.style.height = '1px';
            img.style.marginwidth="0";
            img.style.marginheight="0";
            img.src = "https://www.emjcd.com/u?AMOUNT=0&CID=1507794&OID=" + YAHOO.Local.data['CS_LISTINGS'][id] + "&TYPE=318621&CURRENCY=USD&METHOD=IMG";
            div.appendChild(img);
        }

    },

    track_redirect: function(target, type, url) {

        return;

    }

};
