/**
* Executes a submit of the Dialog BUT does not do a hide, even if validation is successful.
* @method submitNoHide
*/
YAHOO.widget.Dialog.prototype.submitNoHide = function() {
	if (this.validate()) {
		this.beforeSubmitEvent.fire();
		this.doSubmit();
		this.submitEvent.fire();
		return true;
	} else {
		return false;
	}
};

YAHOO.namespace('EU.widget');
YAHOO.EU.widget.Rater = function(container) {
    
    var yRater = this; // Because scope gets lost on inner functions
    
    // Public properties
    this.id = container.id;
    this.options = [];
    this.selectedIndex = -1;
    this.mouseOverIndex = -1;
    this.isLocked = false;
    
    // Custom Events
    this.onChange    = new YAHOO.util.CustomEvent('onChange', yRater);
    this.onMouseOver = new YAHOO.util.CustomEvent('onMouseOver', yRater);
    this.onMouseOut  = new YAHOO.util.CustomEvent('onMouseOut', yRater);

    // 
    this.setValue = function(index) {
        if (index < -1 || index >= this.options.length) { return false; }
        hidden.value = (index == -1) ? '' : this.options[index].value;
        this.selectedIndex = index;
        this.reset();
    };
    
    this.setClasses = function(index, classOne, classTwo) {
        for (var i = 0; this.options.length > i; i++) {
            this.options[i].className = (i <= index) ? classOne : classTwo;
        }
    };

    this.reset = function() {
        if (this.selectedIndex == -1) {
            this.setClasses(this.selectedIndex, 'hover', 'empty');
        } else {
            this.setClasses(this.selectedIndex, 'selected', 'disabled');
        }
    };
    
    this.lock = function() { 
        yRater.isLocked = true; 
    };
    
    this.unlock = function() { 
        yRater.isLocked = false; 
    };
    
    // Container for the rater widget
    var rater = document.createElement('div');
    rater.id = container.id;
    rater.className = 'rater';
	YAHOO.util.Dom.setStyle(rater, 'display', 'block');

    // Attach events
    YAHOO.util.Event.addListener(rater, 'click', function(e) {
        if (!yRater.isLocked) {
            var option = YAHOO.util.Event.getTarget(e);
            var raterIndex = option.raterindex;
            if (!isNaN(raterIndex) && raterIndex !== null) {
                yRater.setValue(raterIndex);
                yRater.setClasses(raterIndex, 'selected', 'disabled');
                yRater.onChange.fire();
            }   
        }
        YAHOO.util.Event.preventDefault(e);
    });
   
    YAHOO.util.Event.addListener(rater, 'mouseover', function(e) {
        if (!yRater.isLocked) {
            var option = YAHOO.util.Event.getTarget(e);
            yRater.mouseOverIndex = option.raterindex;
            if (isNaN(yRater.mouseOverIndex) 
             || yRater.mouseOverIndex === null) { 
                return false; 
            }
            yRater.setClasses(yRater.mouseOverIndex, 'hover', 'empty');
        }
        yRater.onMouseOver.fire();
    });
   
    YAHOO.util.Event.addListener(rater, 'mouseout', function(e) {
        if (!yRater.isLocked) {
            yRater.reset();
        }
        yRater.onMouseOut.fire();
    });

    // Links for options
    var radios = container.getElementsByTagName('input');
    for (var i = 0; radios.length > i; i++) {
        var radio = radios[i];
        if (radio.type != 'radio') { continue; }
        if (radio.checked) { this.selectedIndex = i; }
        var option = document.createElement('a');
        option.href =  '#';
        option.title = radio.title;
        option.value = radio.value;
        option.raterindex = i;
        option.className = 'empty';
    /*  option.innerHTML = radio.getAttribute('title'); */
        rater.appendChild(option);
        yRater.options[yRater.options.length] = option;
    }

    // Hidden field to store value
    var hidden = document.createElement('input');
    hidden.type = 'hidden';
    hidden.name = radios[0].name;
    if (yRater.selectedIndex != -1) {
        hidden.value = yRater.options[yRater.selectedIndex].value;
    }
    rater.appendChild(hidden);
   
    // Make sure the right stars are selected
    yRater.reset();
   
    // Replace the item with our widget
	YAHOO.util.Event.onAvailable(container.id, function() {
		setTimeout(function() { 
			container.parentNode.replaceChild(rater, container);
		}, 500);
	});
};

// LS implementation of the rater
YAHOO.namespace('EU.LocalSearch');
YAHOO.EU.LocalSearch.RatingsAndReviews = function() {
    
    var dlgReview, dlgLogin, dlgThanks,
        loggedIn = false, signInLink,
        rated = [], sYlt = '';

    function getYlt(form){
		if(form.dynraterurl && form.dynraterurl.value!=''){
	        var sRateUrl = form.dynraterurl.value;
	        var sRateUrlYlt = sRateUrl.indexOf(';_ylt');
	        sYlt = sRateUrl.substring(sRateUrlYlt);
		}
    }
    
    function raterOnChange() {
        if (!loggedIn) {
            dlgLogin.cfg.setProperty('context', [this.id, 'tr', 'br']);
            dlgLogin.show();
            this.setValue(-1);
            return false;
        }
        var option = this.options[this.selectedIndex];
        var hoverText = YAHOO.util.Dom.get(this.id + 'text');
        hoverText.defaultText = option.title;
        hoverText.innerHTML = YAHOO.EU.LocalSearch.Strings.saving;
        var form = YAHOO.util.Dom.get(this.id + 'form');
        YAHOO.util.Connect.setForm(form);
        var yRater = this;
		getYlt(form);
        var conn = YAHOO.util.Connect.asyncRequest('GET', '/reputation.php'+sYlt, {
            success : function(o) {
                YAHOO.util.Dom.get(yRater.id + 'link').innerHTML = YAHOO.EU.LocalSearch.Strings.editYourReview;
                eval('var review = ' + o.responseText);
                YAHOO.util.Dom.get('dialog-review-review').value = review.review;
                YAHOO.util.Dom.get('dialog-review-entity').value = review.entity;
                YAHOO.util.Dom.get('dialog-review-cat').value = YAHOO.util.Dom.get(yRater.id + 'cat').value;
                
                var showDialog = true;
                for (var i = 0; rated.length > i; i++) {
                    if (rated[i] == yRater.id) { showDialog = false; break; }
                }
                if (showDialog) {
                    dialogReviewReset();
                    dlgReview.cfg.setProperty('context', [yRater.id, 'tr', 'br']);
                    dlgThanks.cfg.setProperty('context', [yRater.id, 'tr', 'br']);
                    dlgReview.show();
                    rated[rated.length] = yRater.id;
                }
                hoverText.innerHTML = hoverText.defaultText;
				YAHOO.ULT.BEACON = 'http://uk.cartier.local.yahoo.com/t';
				//YAHOO.ULT.beacon_click({'task':form.task.value, 'entity':form.entity.value, 'cat':form.cat.value, '_crumb':form._crumb.value, 'rating':form.rating.value});
            },
            failure : function(o) {
                hoverText.innerHTML = hoverText.defaultText;
            }
        }, null);
    }

    function raterOnChangeNoDialog() {
        var option = this.options[this.selectedIndex];
        var hoverText = YAHOO.util.Dom.get(this.id + 'text');
        hoverText.defaultText = option.title;
        hoverText.innerHTML = YAHOO.EU.LocalSearch.Strings.saving;
        var form = YAHOO.util.Dom.get(this.id + 'form');
        YAHOO.util.Connect.setForm(form);
        var yRater = this;
		getYlt(form);
        var conn = YAHOO.util.Connect.asyncRequest('GET', '/reputation.php'+sYlt, {
            success : function(o) {
                YAHOO.util.Dom.get(yRater.id + 'link').innerHTML = YAHOO.EU.LocalSearch.Strings.editYourReview;
                eval('var review = ' + o.responseText);
                hoverText.innerHTML = hoverText.defaultText;
            },
            failure : function(o) {
                hoverText.innerHTML = hoverText.defaultText;
            }
        }, null);
    }

    function raterOnMouseOver() {
        if (loggedIn) {
            var option = this.options[this.mouseOverIndex];
            var hoverText = YAHOO.util.Dom.get(this.id + 'text');
            hoverText.innerHTML = option.title;
        } else {
            var link = YAHOO.util.Dom.get('rater-signin');
            YAHOO.util.Dom.setStyle(link, 'display', 'block');
            YAHOO.util.Dom.setXY(link, YAHOO.util.Dom.getXY(this.id));
        }
    }
    
    function raterOnMouseOut() {
        if (loggedIn) {
            var hoverText = YAHOO.util.Dom.get(this.id + 'text');
            hoverText.innerHTML = hoverText.defaultText;
        }
    }
    
    function dialogReviewErrorReset() {
        var errs = YAHOO.util.Dom.getElementsByClassName('forerr', 'p', 'dialog-review');
        for (var i = 0; errs.length > i; i++) {
            YAHOO.util.Dom.setStyle(errs[i], 'display', 'none');
        }
    }

    function dialogReviewReset() {
        var fields = ['dialog-review-title', 'dialog-review-general'];
        for (var i = 0; fields.length > i; i++) {
            var field = YAHOO.util.Dom.get(fields[i]);
            if(field) {
                field.value = field.defaultText;
                YAHOO.util.Dom.setStyle(field, 'fontStyle', 'italic');
            }
        }
        dialogReviewErrorReset();
    }
    
    function dialogReviewIsValid() {
        var validTitle  = false,
            validText   = false;
            reviewTitle = YAHOO.util.Dom.get('dialog-review-title');
            reviewText  = YAHOO.util.Dom.get('dialog-review-general');
        if (reviewTitle.value !== '' && 
            reviewTitle.value != reviewTitle.defaultText) {
            validTitle = true;
        }
        if (reviewText.value !== '' && 
            reviewText.value != reviewText.defaultText) {
            validText = true;
        }
        if (!validTitle && !validText) {
            YAHOO.util.Dom.setStyle('dialog-error', 'display', '');
        } else if (!validTitle) {
            YAHOO.util.Dom.setStyle('dialog-error-title', 'display', '');
        } else if (!validText) {
            YAHOO.util.Dom.setStyle('dialog-error-review', 'display', '');
        }
        dlgReview.sizeUnderlay();
        return (!validTitle || !validText) ? false : true;
    }
    
    function createRaterSignInLink() {
        var signin = YAHOO.util.Dom.get('dialog-login-link');
        if (!signin) { return false; }
        var a = document.createElement('a');
        a.href = signin.href;
        a.innerHTML = signin.innerHTML;
        a.id = 'rater-signin';
        YAHOO.util.Dom.setStyle(a, 'position', 'absolute');
        YAHOO.util.Dom.setStyle(a, 'display', 'none');
        YAHOO.util.Dom.setStyle(a, 'background', '#fff');
        YAHOO.util.Event.addListener(a, 'mouseout', function() {
            YAHOO.util.Dom.setStyle(a, 'display', 'none');
        });
        document.body.appendChild(a);
    }

	function initialiseRaters() {
		var docId = document.body.id,
		    fieldsets = [],
			rater,
			hoverText,
			i = 0,
			dlgConfig = {
            	fixedcenter:false,  
	            constraintoviewport:false, 
	            visible:false,
	            draggable:false,
	            underlay:'shadow',
	            iframe:false,
	            zIndex:10
	        };

		YAHOO.util.Dom.setStyle('dialog-review', 'display', 'block');
		YAHOO.util.Dom.setStyle('dialog-thanks', 'display', 'block');
		YAHOO.util.Dom.setStyle('dialog-login', 'display', 'block');

        // SRP functionality initialisation
        if (docId == 'srp' || docId == 'entity') {

            // Determine if the user is logged in or not
            if (!YAHOO.util.Dom.get('dialog-login')) { loggedIn = true; }
            
            if (!loggedIn) { createRaterSignInLink(); }
            
            // Initiate raters
            fieldsets = YAHOO.util.Dom.getElementsByClassName('rater', 'fieldset');
            for (i = 0; fieldsets.length > i; i++) {
                rater = new YAHOO.EU.widget.Rater(fieldsets[i]);
                hoverText = YAHOO.util.Dom.get(rater.id + 'text');
                if (!loggedIn) { rater.lock(); }
                if (rater.selectedIndex != -1) {
                    var option = rater.options[rater.selectedIndex];
                    hoverText.innerHTML = option.title;
					hoverText.innerHTML = YAHOO.EU.LocalSearch.Strings.yourRating;
                    rated[rated.length] = rater.id;
                }
                hoverText.defaultText = hoverText.innerHTML;
                rater.onChange.subscribe(raterOnChange);
                rater.onMouseOver.subscribe(raterOnMouseOver);
                rater.onMouseOut.subscribe(raterOnMouseOut);
            }
            
        
            if (loggedIn) {
                YAHOO.widget.Dialog.prototype.focusFirst = function() { };
                dlgReview = new YAHOO.widget.Dialog('dialog-review', dlgConfig);
                var fields = ['dialog-review-title', 'dialog-review-general'];
                for (i = 0; fields.length > i; i++) {
                    var field = YAHOO.util.Dom.get(fields[i]);
                    if(field) {
                        field.defaultText = field.value;
                        YAHOO.util.Event.addListener(field, 'focus', function() {
                            if (this.value == this.defaultText) { this.value = ''; }
                            YAHOO.util.Dom.setStyle(this, 'fontStyle', 'normal');
                        });
                    }
                }
                dlgReview.cfg.queueProperty("buttons", [{
                    text:YAHOO.EU.LocalSearch.Strings.submit, 
                    handler:function() {
                        dialogReviewErrorReset();
                        if (dialogReviewIsValid()) {
                            this.callback.success = function(o){
                            	eval('var review = ' + o.responseText);
                            	if (review.errorCode === 0) {
                            		dlgReview.hide();
                            		dlgThanks.show();
                            		}
                            	else {
                            		switch(review.errorCode) {
                            			case -999999999:
                            				YAHOO.util.Dom.setStyle('dialog-error-profane', 'display', '');
                            			break;
                            			case -10:
                            				YAHOO.util.Dom.setStyle('dialog-error-timeout', 'display', '');
                            			break;
                            			default:
                  							YAHOO.util.Dom.setStyle('dialog-error-generic', 'display', '');
                            			}
                            		}
                            	};
                            this.submitNoHide();
                        }
                    }, 
                    isDefault:true 
                }, { 
                    text:YAHOO.EU.LocalSearch.Strings.cancel, 
                    handler:function() { 
                        this.cancel(); 
                    } 
                }]);
                dialogReviewErrorReset();
                dlgReview.render();
                dlgThanks = new YAHOO.widget.Dialog('dialog-thanks', dlgConfig);
                dlgThanks.render();
            } else {
                dlgLogin  = new YAHOO.widget.Dialog('dialog-login', dlgConfig);
                dlgLogin.render();
            }
        } else if (docId == 'review') {
            if (!YAHOO.util.Dom.get('dialog-login')) { loggedIn = true; }
            fieldsets = YAHOO.util.Dom.getElementsByClassName('rater', 'fieldset');
            for (i = 0; fieldsets.length > i; i++) {
            	rater = new YAHOO.EU.widget.Rater(fieldsets[i]);
            }
        } else if (docId == 'entityreviews') {
            if (!YAHOO.util.Dom.get('dialog-login')) { loggedIn = true; }
            if (!loggedIn) { 
                dlgLogin  = new YAHOO.widget.Dialog('dialog-login', dlgConfig);
                dlgLogin.render();
                createRaterSignInLink();
            }
            fieldsets = YAHOO.util.Dom.getElementsByClassName('rater', 'fieldset');
            for (i = 0; fieldsets.length > i; i++) {
                rater = new YAHOO.EU.widget.Rater(fieldsets[i]);
                hoverText = YAHOO.util.Dom.get(rater.id + 'text');
                if (!loggedIn) { rater.lock(); }
                if (rater.selectedIndex != -1) {
                    option = rater.options[rater.selectedIndex];
                    hoverText.innerHTML = option.title;
					hoverText.innerHTML = YAHOO.EU.LocalSearch.Strings.yourRating;
                    rated[rated.length] = rater.id;
                }
                hoverText.defaultText = hoverText.innerHTML;
                rater.onChange.subscribe(raterOnChangeNoDialog);
                rater.onMouseOver.subscribe(raterOnMouseOver);
                rater.onMouseOut.subscribe(raterOnMouseOut);
            }
        }
	}
	YAHOO.util.Event.onAvailable('bd', function() {
		setTimeout(initialiseRaters, 500);
	});
} ();

var utf8 = function(wide) {
    var c,
        enc = "",
        i = 0,
        s;
    while(i<wide.length) {
        c= wide.charCodeAt(i++);
        if (c>=0xDC00 && c<0xE000) {
            continue;
        }
        if (c>=0xD800 && c<0xDC00) {
            if (i>=wide.length) {
                continue;
            }
            s= wide.charCodeAt(i++);
            if (s<0xDC00 || c>=0xDE00) {
                continue;
            }
            c= ((c-0xD800)<<10)+(s-0xDC00)+0x10000;
        }
        // output value
        if (c<0x80) {
            enc += String.fromCharCode(c);
        } else if (c<0x800) {
            enc += String.fromCharCode(0xC0+(c>>6),0x80+(c&0x3F));
        } else if (c<0x10000) {
            enc += String.fromCharCode(0xE0+(c>>12),0x80+(c>>6&0x3F),0x80+(c&0x3F));
        } else {
            enc += String.fromCharCode(0xF0+(c>>18),0x80+(c>>12&0x3F),0x80+(c>>6&0x3F),0x80+(c&0x3F));
        }
    }
    return enc;
};


var toHex = function(n) {
    var hexchars = "0123456789ABCDEF";
    return hexchars.charAt(n>>4) + hexchars.charAt(n & 0xF);
};

var encodeURIComponentNew = function(str) {
    var c,
        enc = "",
        okURIchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-",
        s = utf8(str);
    for (var i= 0; i<s.length; i++) {
        if (okURIchars.indexOf(s.charAt(i))==-1) {
            enc += "%"+toHex(s.charCodeAt(i));
        } else {
            enc += s.charAt(i);
        }
    }
    return enc;
};

YAHOO.namespace('EU.LocalSearch');
YAHOO.EU.LocalSearch.ULM = {
    init : function(el) {
        YAHOO.util.Event.addListener(el, 'click', function(e) {YAHOO.util.Event.stopPropagation(e);});
        var els = el.getElementsByTagName('A'),
            obj = {'whatid': el.id.replace('recent-locations-drop','stx'),'whereid':el.id.replace('recent-locations-drop','csz'),'parentel':el};
        for(var i=0,l=els.length; i<l; i++) {
            if(YAHOO.util.Dom.hasClass(els[i],'search-link')) {
                YAHOO.util.Event.addListener(els[i], 'click', YAHOO.EU.LocalSearch.ULM.searchlink,obj);
            }
        }
    },
    vars : {
        panels : {}
    },
    searchlink : function(e,obj) {
        var pval = document.getElementById(obj.whatid).value.replace(/ /gi,'_');
        pval = encodeURIComponentNew(pval);
        pval = pval.replace(/[^a-zA-Z0-9%*_.-]/,'');
        pval = pval.replace(/--/,'-');
        if (pval.length) {
            var href = this.href;
            if( YAHOO.util.Event.isIE ) {
                // fix IE UTF-8 handling
                var urlstr = "";
                var fixedhref = this.href.replace(/http:\/\//gi,'');
                var arr_parts = fixedhref.split("/");
                for(var i=1,l=(arr_parts.length-1);i<l;i++) {
                    urlstr+=escape(arr_parts[i]);
                    urlstr+="/";
                }
                href = "http://"+arr_parts[0]+"/"+urlstr+arr_parts[(arr_parts.length-1)];
            }
            var hrefstr = href.replace(/([^\/]+)?(\/search(?:-\d+)?.html)/ , pval+'$2');
            self.location = hrefstr;
            YAHOO.util.Event.stopPropagation(e);
        } else {
            document.getElementById(obj.whereid).value = this.firstChild.nodeValue;
            YAHOO.EU.LocalSearch.ULM.shut(obj.parentel.id);
            YAHOO.util.Event.stopPropagation(e);
        }
        YAHOO.util.Event.preventDefault(e); 
    },
    shut : function(id) {
        var linkid = id.replace('recent-locations-drop','recent-locations'),
        panel = YAHOO.EU.LocalSearch.ULM.vars.panels[id];
        YAHOO.util.Dom.removeClass(linkid,'open');
        if (panel) { panel.cfg.setProperty("visible", false); }
    },
    toggle : function(e,obj) {
        var panel = obj.panel;
        YAHOO.util.Event.preventDefault(e); 
        YAHOO.util.Event.stopPropagation(e);
        if(YAHOO.util.Dom.hasClass(this,'open')) {
            YAHOO.util.Dom.removeClass(this,'open');
            panel.cfg.setProperty('visible', false);
        } else {
            YAHOO.util.Dom.addClass(this,'open');
            panel.cfg.setProperty('visible', true);
        }
    },
    closeall : function(e) {
        YAHOO.EU.LocalSearch.ULM.shut('recent-locations-drop');
        if(document.getElementById('recent-locations-drop-footer')) {
            YAHOO.EU.LocalSearch.ULM.shut('recent-locations-drop-footer');
        }
    }
};
YAHOO.EU.LocalSearch.refine = {
    vars : {
        text : {}   
    },
    toggle : function(e,obj) {
        var list = obj.list,
            str = YAHOO.EU.LocalSearch.Strings.hide;
        if( this.innerHTML === str ) {
            this.innerHTML = YAHOO.EU.LocalSearch.refine.vars.text[this.id];
        } else {
            this.innerHTML = str;
        }
        for (var i=0,l=list.length; i<l; i++) {
            if (list[i].className != "visible" && list[i].className != "toggle-link") {
                if (list[i].style.display != "list-item") {
                    list[i].style.display = "list-item";
                } else {
                    list[i].style.display = "none";
                }
            }
        }
        YAHOO.util.Event.preventDefault(e);
    }
};

YAHOO.EU.LocalSearch.ULM.fire = function() {
    YAHOO.util.Event.onContentReady('ulmdefault', function() {
	    var myPanel = new YAHOO.widget.Panel('recent-locations-drop', { 
            fixedcenter: false,  
            constraintoviewport: true,  
            close:false,  
            visible:false,  
            draggable:false,
            underlay:'shadow',
            iframe:true,
            context : ['csz','tl','bl'] } ); 
        myPanel.render();
        YAHOO.EU.LocalSearch.ULM.vars.panels['recent-locations-drop'] = myPanel;
        YAHOO.util.Event.addListener('recent-locations', "click", YAHOO.EU.LocalSearch.ULM.toggle, {'panel':myPanel});
        YAHOO.EU.LocalSearch.ULM.init(document.getElementById('recent-locations-drop'));
    });
} ();

YAHOO.EU.LocalSearch.init = function() {
    YAHOO.util.Event.addListener(document, 'click', YAHOO.EU.LocalSearch.ULM.closeall);
    if(document.getElementById('recent-locations-drop-footer')) {
        var myPanel2 = new YAHOO.widget.Panel('recent-locations-drop-footer', { 
            fixedcenter: false,  
            constraintoviewport: false,  
            close: false, 
            visible: false,  
            draggable: false,
            underlay: 'shadow',
            iframe: true,
            context : ['csz-footer','tl','bl'] } ); 
        myPanel2.render();
        YAHOO.EU.LocalSearch.ULM.vars.panels['recent-locations-drop-footer'] = myPanel2;
        YAHOO.util.Event.addListener('recent-locations-footer', "click", YAHOO.EU.LocalSearch.ULM.toggle, {'panel':myPanel2});
        YAHOO.EU.LocalSearch.ULM.init(document.getElementById('recent-locations-drop-footer'));
    }
    
    var arrShowHide = ["show-rel-cats","show-neighbourhoods","show-recently-searched","show-recently-viewed","show-recommended"];
    for(var i=0,l=arrShowHide.length;i<l;i++) {
        var k = arrShowHide[i];
        if( document.getElementById(k) ) {
            var handle = document.getElementById(k);
            var obj = {
                list : handle.parentNode.parentNode.getElementsByTagName("LI")
            };
            YAHOO.EU.LocalSearch.refine.vars.text[k] = handle.innerHTML;
            YAHOO.util.Event.addListener(k, 'click', YAHOO.EU.LocalSearch.refine.toggle, obj);
        }
    }
};

YAHOO.EU.LocalSearch.ReviewCharCount = {
    counter: null,
    start: function() {
        var left = 4000 - document.getElementById('revt').value.length;
        var rem = document.getElementById('remain');
        rem.innerHTML = left;
        this.counter = setTimeout(YAHOO.EU.LocalSearch.ReviewCharCount.start, 500);
    },
    end: function() {
        clearTimeout(this.counter);
    }
};
YAHOO.util.Event.addListener(window, 'load', function() {
	if (document.body.id == 'review') {
		YAHOO.EU.LocalSearch.ReviewCharCount.start();
		YAHOO.EU.LocalSearch.ReviewCharCount.end();
	}
});  
YAHOO.util.Event.addListener('revt', 'focus', YAHOO.EU.LocalSearch.ReviewCharCount.start);
YAHOO.util.Event.addListener('revt', 'blur', YAHOO.EU.LocalSearch.ReviewCharCount.end);
YAHOO.util.Event.addListener(window, 'load', YAHOO.EU.LocalSearch.init);
YMap.prototype.addCustomTypeControl = function(_c) {
	var map = this;
	var ext = 'png';
	var imgstem = 'http://l.yimg.com/eur.yimg.com/i/eu/se/a/';
	var offsuffix = 'o';
	var onsuffix = 'o1';
	var rollsuffix = 'r';
	var maptypeconstants = {
		map: {
			ct: YAHOO_MAP_REG
			},
		hyb: {
			ct: YAHOO_MAP_HYB
			},
		sat: {
			ct: YAHOO_MAP_SAT
			}
		};
	var mapTypeSwitch = function(e) {
		var which = this.id.substr(0,3);
		var current = map.getCurrentMapType().substr(6,3).toLowerCase();
		if (which != current) {
			map.setMapType(maptypeconstants[which].ct);
			var currimg = document.getElementById(current+'img');
			var whichimg = document.getElementById(which+'img');
			currimg.src = imgstem+current+offsuffix+'.'+ext;
			whichimg.src = imgstem+which+onsuffix+'.'+ext;
			}
		};
	var mapTypeHover = function(e) {
		var which = this.id.substr(0,3);
		var current = map.getCurrentMapType().substr(6,3).toLowerCase();
		if (which != current) {
			var whichimg = document.getElementById(which+'img');
			var rlsrc = imgstem+which+rollsuffix+'.'+ext;
			if (whichimg.src.indexOf(rlsrc) != -1) {
				whichimg.src = imgstem+which+offsuffix+'.'+ext;
				}
			else {
				whichimg.src = rlsrc;
				}
			}
		};
	var maptypes = this.getMapTypes();
	var currenttype = this.getCurrentMapType();
	var currstr = currenttype.substr(6,3).toLowerCase();
	var imgsize = [37,17];
	var margin = 2;
	if (!_c) {
		var _c = new YCoordPoint(7,5);
		}
	var ysize = new YSize(imgsize[0],imgsize[1]);
	var imgstyles = {cursor: 'pointer'};
	var inc = 0;
	for (var i=maptypes.length-1;i>=0;i--) {
		var typestr = maptypes[i].substr(6,3).toLowerCase();
		var imgstr = imgstem+typestr;
		typestr == currstr ? imgstr += onsuffix+'.'+ext : imgstr += offsuffix+'.'+ext;
		img = YUtility.createNode('img',typestr+'img');
		img.src = imgstr;
		YUtility.setStyle(img,imgstyles);
		var ctr = YUtility.createNode('div',typestr+'ctrl');
		YUtility.appendNode(ctr,img);
		var x = _c.x;
		var y = _c.x;
		if (inc>0) {
			x += (margin + imgsize[0])*inc;
			}
		inc++;
		var cp = new YCoordPoint(x,y);
		cp.translate('right','top');
		var mkr = new YCustomOverlay(cp,ctr);
		this.addOverlay(mkr);
		YEvent.Capture(mkr,EventsList.MouseClick,mapTypeSwitch,mkr);
		YEvent.Capture(mkr,EventsList.MouseOver,mapTypeHover,mkr);
		YEvent.Capture(mkr,EventsList.MouseOut,mapTypeHover,mkr);
		}
	};
YMarker.prototype.enableAutoContainAutoExpand = function() {
	this._autoContainAutoExpand = true;
};

YMarker.prototype.disableAutoContainAutoExpand = function() {
	this._autoContainAutoExpand = false;
};

YMarker.prototype.autoContainAutoExpand = function(e) {
	var map = this._map;
	var coord = map.convertLatLonXY(this.YGeoPoint);
	var csize = map.getContainerSize();
	var offsetx = csize.width - coord.x;
	var offsety = csize.height - (csize.height - coord.y);
	// var pop = document.getElementById(this.id).childNodes[1];
	var pop = document.getElementById('ysmwexp');
	var popw = pop.offsetWidth;
	var poph = pop.offsetHeight;
	if (!margin) {
		var margin = 20;
		}
	var cl = map.getCenterLatLon();
	var cc = map.convertLatLonXY(cl);
	var pantox = cc.x;
	var pantoy = cc.y;
	var pan = false;
	if (offsetx < (popw+margin)) {
		pantox = cc.x + (offsetx - (popw+margin));
		pan = true;
	}
	if (offsety < (poph+margin)) {
		pantoy = cc.y - (offsety - (poph+margin));
		pan = true;
	}
	if (pan) {
		var panto = new YCoordPoint(pantox,pantoy);
		map.panToXY(panto);
	}
};

YMarker.prototype.addAutoExpandWithFix = function(infoValue) {
	this.addAutoExpand(infoValue);
	YEvent.Capture(this, EventsList.openExpanded, this.fixAutoExpandPosition);
	if (this._autoContainAutoExpand) {
		YEvent.Capture(this, EventsList.MouseOver, this.autoContainAutoExpand);
	};
};
YAHOO.EU.YMapsLocal.Map = {
	cmap: null,
	config: {
        imgPrefixURL:'http://us.i1.yimg.com/us.yimg.com/i/us/map/aj/',
	    tileReg:['http://maps.yimg.com/hx/tl?v=4.2&t=m&.intl='+YAHOO.EU.YMapsLocal.Localised.strings.intl+'&f=j&s=256&', 'http://maps.yimg.com/hx/tl?v=4.2&t=m&.intl='+YAHOO.EU.YMapsLocal.Localised.strings.intl+'&f=j&s=256&'],
        tileSat:['http://maps.yimg.com/ae/ximg?v=1.9&t=a&s=256&'], 
        tileHyb:['http://maps.yimg.com/hx/tl?v=4.2&t=h&.intl='+YAHOO.EU.YMapsLocal.Localised.strings.intl+'&s=256&'],
        locale: YAHOO.EU.YMapsLocal.Localised.strings.locale,
        copyText: YAHOO.EU.YMapsLocal.Localised.strings.copyText
	},
	bmrkrs: [],
	cpage: null,
	fixAutoExpandPosition: function(e) {
		// 'this' is the image icon
		// get the smart window
		var sw = document.getElementById("ysmwexp");
		// this is what the offset for this smartwindow should be
		var offsetx = this.offsetSmartWindow.x;
		var offsety = this.offsetSmartWindow.y;
		// this is what it actually is
		var currx = parseInt(sw.style.left);
		var curry = parseInt(sw.style.bottom);
		// if they are different, then adjust them
		if (offsetx !== currx) {
			sw.style.left = offsetx+'px';
			}
		if (offsety !== currx) {
			sw.style.bottom = offsety+'px';
			}	
		},
	buildSmartWindow: function(e) {
		var ns = YAHOO.EU.YMapsLocal;
		var data = this;
		var dirstr = encodeURIComponentNew(data.address+', '+data.zip);
		var content = '<div class="eu-maps-sw">';
		content += '<h1><em>'+data.record_num+'</em> '+data.cname+'</h1>';
		content += '<div class="address">';
		content += data.address + '<br>';
		content += data.zip + '<br>';
		content += data.telnum ;
		content += '</div>';
		if (data.ratings && data.ratings.canreview == 1) {
			var altstr = '';
			if (data.ratings.average != '') {
				altstr = ns.Localised.strings.avgRRalt.replace(/%1/,data.ratings.average);
				}
			else {
				altstr = ns.Localised.strings.firstToRate;
				}
			content += '<div class="rating">';
			content += '<a href="'+data.rurl+'"><img src="'+data.ratings.img+'" alt="'+altstr+'" border="0"></a>';
			if (data.ratings.users == '') {
				data.ratings.users = 0;
				}
			content += ' ('+data.ratings.users+')';
			content += ' <a href="'+data.rurl+'">'+ns.Localised.strings.rateIt+'</a>';
			content += '</div>';
			}
		content += '<div class="directions">';
		content += ns.Localised.strings.dirLabel;
		content += ' <a href="'+data.tourl+'">'+ns.Localised.strings.dirTo+'</a>';
		content += ' | <a href="'+data.fromurl+'">'+ns.Localised.strings.dirFrom+'</a>';		
		content += '</div>';
if (data.ratings && data.ratings.canreview == 1) {
		content += '<div class="more-info"><a href="'+data.url+'">'+ns.Localised.strings.moreInfo+'</a></div>';
}
		content += '</div>';
		e.thisObj.openSmartWindow(content);		
		},
	initmap: function() {
		var ns = YAHOO.EU.YMapsLocal;
		YMapConfig.set(ns.Map.config);
		// var pginfo = ns.Settings[ns.Map.cpage];
		var mapdiv = ns.Settings.mapdiv;
		// var mtype;
		// pginfo.maptype ? mtype = pginfo.maptype : mtype = ns.Settings.maptype;
		var mtype = ns.Settings.maptype;
		var mapsize = new YSize(ns.Settings.mapwidth,ns.Settings.mapheight);
		var map = new YMap(document.getElementById(mapdiv),mtype,mapsize);
		ns.Map.cmap = map;
		return map;
		},
	popit: function() {
		var ns = YAHOO.EU.YMapsLocal;
		var locset = ns.Settings.loc;
		var pop = ns.Map.createpopdiv(locset.normalised);
		this.openSmartWindow(pop);
		},
	drawmap: function() {
		var ns = YAHOO.EU.YMapsLocal;
		// ns.YMaps.cpage = page;
		// var pginfo = ns.Settings[ns.Map.cpage];
		var map = ns.Map.initmap();
		var locset = ns.Settings.loc;
		var poi = new YGeoPoint(locset.coords.lat,locset.coords.lon);
		var staricon = new YImage(locset.icon.src,new YSize(locset.icon.w,locset.icon.h),new YCoordPoint(11,11),new YCoordPoint(-11,8));
		var locmarker = new YMarker(poi,staricon);
		if (ns.Settings.locblurb) {
		    locmarker.enableAutoContainAutoExpand();
		    locmarker.addAutoExpandWithFix('<h1 class="mapbubble">'+locset.normalised+'</h1>');
		    }
		locmarker.setSmartWindowColor('ff0000');
		map.addOverlay(locmarker);
		YEvent.Capture(locmarker, EventsList.openExpanded, ns.Map.fixAutoExpandPosition, staricon);
		var cen;
		var zl;
		if (!ns.Settings.multi) {
			cen = poi;
			zl = parseInt(locset.zl);
			}
		else {
			var pts = [poi];
			var busdata = ns.Busdata;
			var binfo = busdata.businesses;
			var dp = ns.Settings.datapoint;
			var icon = dp.icon;
			var nc;
			var pt;
			var mrkr;
			var buspop;
			for (var i=0;i<busdata.total;i++) {
				binfo[i].record_num < 10 ? nc = '0'+binfo[i].record_num : nc = binfo[i].record_num;
				var imgsize = binfo[i].record_num>=100 ? new YSize(31,29) : new YSize(23,29);
				var imgsrc = binfo[i].record_num>=100 ? 'http://us.i1.yimg.com/us.yimg.com/i/us/ls/gr/lcl_mrk_wide3.png' : 'http://us.i1.yimg.com/us.yimg.com/i/us/ls/gr/local_map_marker_orange.png';
				bicon = new YImage(imgsrc,imgsize,new YCoordPoint(0,0));
				pt = new YGeoPoint(binfo[i].coord.lat,binfo[i].coord.lon);
				pts.push(pt);
				mrkr = new YMarker(pt,bicon);
				mrkr.addLabel("<span class=\"mapnum-label\""+(binfo[i].record_num>=100?' style="margin-left:2px;"':'')+">" + (binfo[i].record_num) + "</span>");
				if (!ns.Settings.printable) {
				mrkr.enableAutoContainAutoExpand();
				mrkr.addAutoExpandWithFix('<h1 class="mapbubble">'+'<em class="mapnum">'+binfo[i].record_num+'</em> '+binfo[i].cname+' <strong>&#187;</strong></h1>');
				mrkr.setSmartWindowColor('f19284');
				YEvent.Capture(mrkr, EventsList.MouseClick,ns.Map.buildSmartWindow,binfo[i]);
				YEvent.Capture(mrkr, EventsList.openExpanded, ns.Map.fixAutoExpandPosition, bicon);
				}
				ns.Map.bmrkrs[binfo[i].record_num] = mrkr;
				map.addOverlay(mrkr);
				}
			var zc = map.getBestZoomAndCenter(pts);
			cen = zc.YGeoPoint;
			zl = zc.zoomLevel;
			}
		var zp = new YCoordPoint(ns.Settings.zp.x,ns.Settings.zp.y);
		var pp = new YCoordPoint(ns.Settings.pp.x,ns.Settings.pp.y);
		map.disableKeyControls();
		// map.addPanControl(pp);
		if (!ns.Settings.printable) {
			map.addZoomLong(pp);
			map.addTypeControl();
			// map.addCustomTypeControl();
			}
		map.drawZoomAndCenter(cen, zl);
		// has to go after zoom & center
		// otherwise getUnitsPerPixel() returns 0
		if (isNaN(parseInt(zl))) {
			var bounds = locset.bounds;
			var dist = 0;
			var mapd = 0;
			var ne = new YGeoPoint(bounds.ne.lat,bounds.ne.lon);
			var nw = new YGeoPoint(bounds.ne.lat,bounds.sw.lon);
			var sw = new YGeoPoint(bounds.sw.lat,bounds.sw.lon);
			var midlon = ne.middle(nw);
			var selon = sw.Lon - ((nw.Lon - midlon.Lon)*2);
			var se = new YGeoPoint(bounds.sw.lat,selon);
			var bb = new YPolyline([ne,nw,sw,se,ne],'red',2);
			// this will display the bounding box on the map in a red line
			// map.addOverlay(bb);
			var distlat = nw.distance(ne).kilometers;
			var distlon = sw.distance(nw).kilometers;
			distlon > distlat ? dist = distlon : dist = distlat;
			distlon > distlat ? mapd = ns.Settings.mapheight : mapd = ns.Settings.mapwidth;
			var zls = map.getZoomValidLevels();
			var upps = [];
			upps[0] = 0;
			for (var i=0;i<zls.length;i++) {
				var upp = map.getUnitsPerPixel(zls[i]);
				var kpp = upp.kilometers;
				var tmpd = kpp*mapd;
				upps[i+1] = [tmpd];
				if (dist < (tmpd*1.1) && dist > upps[i]) {
					zl = zls[i];
					map.setZoomLevel(zl);
					break;
					}
				}
			}
		},
	infoopen: function() {
		var ns = YAHOO.EU.YMapsLocal;
		var con = '<div class="mapbubble"><span class="mapnum">'+this.record_num+'</span> '+this.cname+'</div>';
		ns.Map.bmrkrs[this.record_num].openSmartWindow(con);
		},
	createpopdiv: function(content) {
		return '<div class="mapbubble">'+content+'</div>';
		},
	createmarker: function(ygeo,imgobj,offset) {
		var img = new YImage();
		img.src = imgobj.src;
		img.size = new YSize(imgobj.w,imgobj.h);
		if (!offset) {
			var offset = {x:0,y:0};
			}
		img.offsetSmartWindow = new YCoordPoint(offset.x,offset.y);
		var marker = new YMarker(ygeo,img);
		return marker;
		}
	};
