﻿function addEventHandler(element, event, handler) {
	if (element.attachEvent) {
		// MS registration model
		element.attachEvent('on' + event, handler);
	} else if (element.addEventListener) {
		// NN (W4C) regisration model
		element.addEventListener(event, handler, false);
	} else {
		// old regisration model as fall-back
		element[event] = handler;
	}
}
function getEventSource(evt) {
	if (document.attachEvent) {
		return evt.srcElement;
	} else if (document.addEventListener) {
		return evt.target;
	} else {
		return window.event.srcElement;
	}
}

function initReturnKeySubmit() {
    var inputs = document.getElementsByTagName("input");
	for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].getAttribute("returnKeyTarget")) {
            inputs[i].setAttribute("autocomplete", "off");
            addEventHandler(inputs[i], "keydown", returnKeyListener);
        }
    }
}

var returnTargetBtn;
function returnKeyListener(e) {
    var evt = e || window.event;
    var elem = getEventSource(e);
    returnTargetBtn = document.getElementById(elem.getAttribute("returnKeyTarget"));
    if (returnTargetBtn && (evt.which && evt.which == 13) || (evt.keyCode && evt.keyCode == 13)) {
        skipReset = true;
        window.setTimeout(executeReturnKeySubmit, 1000);
        return false;
    } else {
        return true;
    }    
}

function executeReturnKeySubmit() {
    if (returnTargetBtn)
    {
        skipReset = false;
        returnTargetBtn.click();
    }
}

/*
    Following three functions work together to enable text fields that display
    dimmed helper text until given focus. To enable this behaviour, text inputs
    must have a custom attribute added called "helptext" with the value of the
    text to be displayed prior to the field receiving focus. Then, at page
    load, the initHelpTextFields function needs to be called.
 */
function initHelpTextFields() {
 	var inputs = document.getElementsByTagName("input");
	for (var i = 0; i < inputs.length; i++) {
        var helpText = inputs[i].getAttribute("helptext");
		if (helpText) {
            if (inputs[i].value.length == 0 || inputs[i].value == helpText) {
                // inputs[i].className = "textinput helptext";
                inputs[i].className += " helptext";
                inputs[i].value = helpText;
            }
			addEventHandler(inputs[i], "focus", setTextFieldActive);
			addEventHandler(inputs[i], "blur", resetTextField);
		}
	}
}

function setTextFieldActive(e) {
    var elem = getEventSource(e);
    var helpText = elem.getAttribute("helptext");
    if (elem.value == helpText) {
	    // elem.className = "textinput";
	    if (elem.className.indexOf("helptext") != -1) {
	        elem.className = elem.className.substring(0, elem.className.indexOf(" "));
	        // window.alert("'" + elem.className + "'");
	    }
	    elem.value = "";
    }
}

function resetTextField(e) {
    var elem = getEventSource(e);
    var helpText = elem.getAttribute("helptext");
    if (elem.value.length == 0 || elem.value == helpText) {
	    // elem.className = "textinput helptext";
	    elem.className += " helptext";
	    elem.value = helpText;
    }
}

function listSizeSelectToTableHead() {    
    // find the pager row...
	var trs = document.getElementsByTagName("tr");
	var pagerRow;
	for (var i = 0; i < trs.length; i++) {
		if (trs[i].className == "pagerrow") {
			pagerRow = trs[i];
			break;
		}
	}
	
    // try to find the page size control wrapper
    var spans = document.getElementsByTagName("span");
    var pageSizeSpan;
    for (var i = 0; i < spans.length; i++) {
        if (spans[i].className == "pageSizeSelectorWrap") {
            pageSizeSpan = spans[i];
            break;
        }
    }
    
    // if page size control found copy it and remove it from DOM
    var pageSizeNode;
    if (pageSizeSpan) {
        pageSizeNode = pageSizeSpan.cloneNode(true);
        var orgSelects = pageSizeSpan.getElementsByTagName("select");
        var newSelects = pageSizeNode.getElementsByTagName("select");
        newSelects[0].selectedIndex = orgSelects[0].selectedIndex;
        if (!newSelects[0].onchange || newSelects[0].onchange === undefined) {
            newSelects[0].onchange = orgSelects[0].onchange;
        }
        pageSizeSpan.parentNode.removeChild(pageSizeSpan);
		pageSizeNode.style.display = "inline";
    }    
	
	if (pagerRow) {
		// add links to pager cell
		// get the first cell in the row
		var cell = pagerRow.firstChild;
		while (cell && cell.nodeName != "TD") {
			cell = cell.nextSibling;
		}
		if (!cell || cell.nodeName != "TD") return;		
		
		// get the pager table
		var pagerTable = cell.firstChild;
		while (pagerTable && pagerTable.nodeName != "TABLE") {
			pagerTable = pagerTable.nextSibling;
		}
		if (!pagerTable || pagerTable.nodeName != "TABLE") return;
		
		// create a new TD node and append it to pager table TDs
		if (pageSizeNode) {
		    var pagerLinkRow = pagerTable.firstChild;
		    while (pagerLinkRow && pagerLinkRow.nodeName != "TR") {
		        if (pagerLinkRow.nodeName == "TBODY")
		            pagerLinkRow = pagerLinkRow.firstChild;
		        else
		            pagerLinkRow = pagerLinkRow.nextSibling;
		    }
		    if (pagerLinkRow && pagerLinkRow.nodeName == "TR") {
		        var pageSizeCell = document.createElement("td");
		        pageSizeCell.appendChild(pageSizeNode);
		        pagerLinkRow.appendChild(pageSizeCell);
		    }
		}
	} else {
		// no pager so add DIV before list table
		// find the list table
		var tables = document.getElementsByTagName("table");
		var listTable;
		for (var i = 0; i < tables.length; i++) {
			if (tables[i].className == "restaurantList") {
				listTable = tables[i];
			}
		}
		if (!listTable) return;
		// create a wrapper element for links
		var headerLinkWrap = document.createElement("div");
		headerLinkWrap.className = "clearfix listHeadLinkWrap";
		
		// insert into wrapper element
		if (pageSizeNode) headerLinkWrap.appendChild(pageSizeNode);
		
		// insert the wrapper element into the DOM
		listTable.parentNode.insertBefore(headerLinkWrap, listTable);
	}    
}

function changeOpacityDiv(id) {
    var object=document.getElementById(id);
    changeOpacity(100,id);
}

function changeOpacity(opacity, id)
{
    var object = document.getElementById(id).style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")"; try{ object.removeAttribute("filter"); } catch(err) {}
}

function getMouseCoords(e) {
	if (!e) var e = window.event;
	var mCoords = new Array(2);
	if (e.pageX || e.pageY) {
		mCoords[0] = e.pageX;
		mCoords[1] = e.pageY;
	} else if (e.clientX || e.clientY) {
		mCoords[0] = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		mCoords[1] = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
	}
	return mCoords;
}

function initPopupExtenderHelper(behaviourId) {
    var extender = $find(behaviourId);
    if (extender) {
        $addHandler(document.body, 'click', function(){toggleWindowedControls(true);});
        $addHandler(extender.get_element(), 'click', function(){toggleWindowedControls(false);});
        var closers = getElementsByCssClass("a", "closer", extender._popupControlID);
        if (closers.length > 0) {
            $addHandler(closers[0], 'click', function(){toggleWindowedControls(true);extender.hidePopup();});
        }
    }
}

function getElementsByCssClass(tagName, className, parentElementId) {
    if (!parentElementId) parentElem = document;
    else parentElem = document.getElementById(parentElementId);
    var elems = new Array();
    if (parentElem) {
        var testElems = parentElem.getElementsByTagName(tagName);
        for (var i = 0; i < testElems.length; i++)
            if (testElems[i].className == className) elems[elems.length] = testElems[i];
    }
    return elems;
}

function toggleWindowedControls(setVisible) {
    setControlCollectionVisibility(document.getElementsByTagName("object"), setVisible);
    setControlCollectionVisibility(document.getElementsByTagName("embed"), setVisible);
}

function setControlCollectionVisibility(controls, isVisible) {
    var visibility = isVisible ? "visible" : "hidden";
    for (var i = 0; i < controls.length; i++) {
        if (controls[i].style.visibility != visibility && controls[i].parentNode.id != 'uxAdHeader')
            controls[i].style.visibility = visibility;
    }
}

function cancelPopupDialog(dialogId, behaviourId) {
    var dialog = document.getElementById(dialogId);
    if (dialog) {
        var inputs = dialog.getElementsByTagName("input");
        for (var i = 0; i < inputs.length; i++) {
            if (inputs[i].type == "text") inputs[i].value = "";
        }
    }
    var extender = $find(behaviourId);
    if (extender) extender.hidePopup();
}

function writeMLink(id, text, subj, dom) {
	if (!dom) dom = "wherethelocalseat";
	var url = id + unescape("%40") + dom + "." + "com";
	document.write("<a href=\"ma" + "ilto:" + url);
	if (subj) document.write("?" + "sub" + "ject=" + escape(subj));
	document.write("\" onmouseover=\"window.status=''; return true;\">");
	if (text) document.write(text);
	else document.write(url);
	document.write("</a>");
}

var printWindow;
function openPrintWindow(pageType, idParam) {
    var url;
    if (pageType == "list") {
        url = "/PrintRestaurantList.aspx?mid=" + idParam;
    } else {
        url = "/PrintRestaurant.aspx?rid=" + idParam;
    }
    if (!printWindow || printWindow.closed)
        printWindow = window.open(url, 'printwin', 'height=600,location=no,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no,width=660');
    else
        printWindow.location.replace(url);
    printWindow.focus();
}

var mapWindow;
function openMapWindow(url) {
    if(!mapWindow || mapWindow.closed)
        mapWindow = window.open(url,'mapwin','height=665,location=no,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no,width=845');
    else
        mapWindow.location.replace(url);
    mapWindow.focus();
}

var otWindow;
function openOTWindow(url) {
    if(!otWindow || otWindow.closed)
        otWindow = window.open(url,'otwin','height=600,location=no,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no,width=660');
    else
        otWindow.location.replace(url);
    otWindow.focus();
}

var awardWindow;
function openAwardWindow(rid) {
    var url = "/superlatives/GetSuperlative.aspx?rid=" + rid;
    if(!awardWindow || awardWindow.closed)
        awardWindow = window.open(url,'otwin','height=600,location=no,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no,width=625');
    else
        awardWindow.location.replace(url);
    awardWindow.focus();
}

function onChangeOrBlurSetClass() {
    var ddl = document.getElementById(searchCitySelectId);
    var term = document.getElementById(searchTermFieldId);
    if(term.value == "food name or a cuisine" || term.value == "restaurant name") {
        term.className = "searchfield helptext";
    }
    else {
        term.className = "searchfield";
    }
}

function onChangeSetDisplay() {
    var ddl = document.getElementById(searchCitySelectId);
    var term = document.getElementById(searchTermFieldId);
    var nameOnly = document.getElementById("uxByNameWrapper");
    term.style.display = "inline";
    nameOnly.style.visibility = "visible";
}

function changeSearchHelpText() {
    var check = document.getElementById(searchNameCheckId);
    var term = document.getElementById(searchTermFieldId);
    if(check.checked) {
        term.setAttribute("helptext", "restaurant name");
        if (term.value == "food name or a cuisine") {
            term.value = "restaurant name";
        }
    } else {
        term.setAttribute("helptext", "food name or a cuisine");
        if (term.value == "restaurant name") {
            term.value = "food name or a cuisine";
        }
    }
}

function performSearch(fieldId, rootRel) {
    var searchField = document.getElementById(fieldId);
    if (!rootRel) rootRel = "";
    //window.alert("helptext = " + searchField.getAttribute("helptext") + "\nsearch term = " + searchField.value);
    if (searchField.value != searchField.getAttribute("helptext")) {
        var searchTerm = encodeURIComponent(searchField.value);
        if (searchTerm.length > 0) location.href = rootRel + "search.aspx?q=" + searchTerm;
    }
}