function MM_jumpMenu(targ,selObj,restore){ //v3.0
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0;
}

// Special Jumper for Finders only that allows for additional URL parameters
function MM_jumpMenuFinder(targ,selObj,restore,params){ //v3.0
  // targ = target window for the url
  // selObj = the select box
  // restore = unknown
  // params = additional parameters for the url
  
  // Checking to see if there are already params in the URL
  var strUrl = selObj.options[selObj.selectedIndex].value;
  if(strUrl.indexOf("?") > 0)
    strUrl = strUrl + "&";
  else
    strUrl = strUrl + "?";
  strUrl = strUrl + params;
  eval(targ+".location='"+strUrl+"'");
  if (restore) selObj.selectedIndex=0;
}

function MM_jumpMenu_blank(selObj){
  window.open(selObj.options[selObj.selectedIndex].value, '_blank');
}

function nameSort(a,b) {if (a.name<b.name) return -1;if (a.name>b.name) return 1;return 0}			
function movieSort(a,b) {if (a.moviename<b.moviename) return -1;if (a.moviename>b.moviename) return 1;return 0}			

var isFirefox = false;
if(navigator.userAgent.indexOf("Firefox")!=-1){
  isFirefox = true;
}

xmlhttp=null
// code for Mozilla, etc.
if (window.XMLHttpRequest)
  {
  xmlhttp=new XMLHttpRequest()
  }
// code for IE
else if (window.ActiveXObject)
  {
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
  }

if (typeof topsFinder == "undefined") {
	var topsFinder = function(){ // apply a topsFinder namespace
		var maxRetryCount = 5

		function createMethodReference_(obj,methodName){
			return function(){obj[methodName]()}
		}

		selectorjsonresp_ = function(jsondata) {
			//remove highlite from first option
			if (this.idx < this.options.length && this.options[this.idx].className == "hilite") {
			  this.options[this.idx].className = "";
			  this.options[this.idx].text = this.title;
			  this.options[this.idx].selected = true;
			}
			
			try {
				items = jsondata.results
				this.jsonerrorcount=0
			}
			catch(ex){
				if ((!this.jsonerrorcount)||(isNaN(this.jsonerrorcount))) this.jsonerrorcount = 0
				this.jsonerrorcount++
				if (this.jsonerrorcount<maxRetryCount) {
					window.setTimeout(createMethodReference_(this,'fillme'),1000)
				}
				else {
					// too many errors. bail.
				}
				this.disabled = false;
				return
			}
			
			origOpt = (this.selectedIndex>=0)?this.options[this.selectedIndex]:false
			origOptValue = ''+origOpt.value
			origOptText = ''+origOpt.text

			try {
				origOptValue = $(this.finder.id+'_Current_'+this.facet).value
			} catch(ex){}
			
			if (this.filter) {
			  var filtereditems = new Array();
              j=0;
			  for (i=0;i<items.length;i++) {
			    if (items[i].name.match(this.filter)) {
			      filtereditems[j++] = items[i];
			    }
			  }
			  items = filtereditems;
			}
			
			numitems = items.length;
			items.sort(nameSort);

			
			//always save unfiltered names just incase we filter it below
			for (i=0;i<numitems;i++) {
			  items[i].unfiltered = items[i].name;
			}
			
			//if it has an id, then we have to strip it out (so it wont be displayed and so the categories can collapse)
			//(and it has to have collapse if it has hasid...)
			if (this.className.indexOf("hasid") != -1) {
			    for (i=0;i<numitems;i++) {
			      items[i].name = items[i].name.substring(items[i].name.indexOf("/"));
			    }
			    items.sort(nameSort)
			}

			if (this.className.indexOf("collapse") != -1) {
			    var key="";
			    for (i=0;i<numitems;i++) {
			        key = items[i].name;
			        while (key.indexOf("..") == 0) {
			          key = key.substring(2,key.length);
			        }
			        for (j=i+1;j<numitems;j++) {
			            if (items[j].name.indexOf(key + "/") > -1) {
			                items[j].name = items[j].name.replace(key, "..");
			                items[i].heading = 1;
			            } else {
			                break;
			            }
			        }
			    }
	    }
      this.options.length=1;
			for(i=0;i<numitems;i++) {
				  if (this.className.indexOf("collapse") != -1) {
				    optText = items[i].name.replace(/(?=\.*)\//, ''); //remove / from text
				    optValue = items[i].unfiltered;
		      } else {
				      optText = (this.strip)?items[i].name.replace(this.strip,''):items[i].name
				      optValue = items[i].name
		      }
		      if (optText.match(/^\s*$/) != null || optText == "Unknown") {
			        continue;
			    }
			    if (this.className.indexOf("hidecount") == -1) {
			        optText += " ( " + items[i].value + " ) ";
			    }
		      this.options[this.length] = new Option(optText, optValue);
				  if (items[i].heading == 1) {
				    this.options[this.length-1].className = "heading";
				  }
			}
			
			for(i=0;i<this.length;i++) {
				if (origOptValue==this.options[i].value) this.options[i].selected=true
			}
			try{$(this.finder.id+'_Spinner').style.visibility="hidden"}catch(ex){}
			this.loaded = 1;
			this.disabled = false;
		}

		selectedvalue_ = function() {
			var index = this.selectedIndex
			if (index<1) return ''
			var opt = this.options[index]
			return opt.value||opt.text
		}
		
		selectedtext_ = function() {
			var index = this.selectedIndex
			if (index<0) return ''
			var opt = this.options[index]
			return opt.text
		}

		doselect_ = function(){
			try {
				$(this.finder.id+'_Current_'+this.facet).value=this.selectedvalue()
			} catch(ex){}
			var count=0;
		    for (var k in this.finder.selectors) {
			  var aselector = this.finder.selectors[k]
			  if (this!=aselector) {
			     aselector.fillme();
			     count++;
			  }
			}
			
			//check if only one and they didnt tell us to wait for the user to click go
			if (count == 0 && this.className.indexOf("wait4click") == -1) {
			  this.dosearch();
			}
		}

		fillme_ = function(){
			if (this.facet.indexOf("Param:") == -1) { //if it starts with param then dont bother filling it
			  var queryurl = this.finder.counturl()
			  try{$(this.finder.id+'_Spinner').style.visibility="visible"}catch(ex){}
			  queryurl+=this.finder.refinements(this)
			  jsonreq.call(queryurl+'&groupby='+escape(this.facet.replace(/__/,':/')),this)
			}
		}
		
        prefill_ = function(){
		  if (!this.loaded || this.options.length == 1) {
		    if (!isFirefox) {
		      this.disabled = true;
		      if (!this.title) {
		        this.title = this.options[this.idx].text;
		      }
		    }
		    this.options[this.idx] = new Option("LOADING...", "");
		    this.options[this.idx].className = "hilite";
		    this.fillme();
		  }
		}
		
		jumpfill_ = function(){
		  if (!this.loaded) {
		    if (!isFirefox) {
		      this.disabled = true;
		      if (!this.title) {
		        this.title = this.options[this.idx].text;
		      }
		    }
		    this.options[this.idx] = new Option("LOADING...", "");
		    this.options[this.idx].className = "hilite";
		     xmlhttp.open("GET", this.fillurl ,true);
		     var control = this;
             xmlhttp.onreadystatechange=function() {
               if (xmlhttp.readyState==4) {
                 var items = eval( '(' + xmlhttp.responseText + ')').results;
                 control.length = 1;
                 
            if (control.className.indexOf("moviesort") != -1) {
			  var name;
			  for (i=0;i<items.length;i++) {
			    name = items[i].name;
			    name = name.replace(/^The\s/i, "");
			    name = name.replace(/^A\s/i, "");
			    name = name.replace(/^An\s/i, "");
			    items[i].moviename = name;
			  }
			  items.sort(movieSort);
			} else {
			  items.sort(nameSort);
			}
                 
                 for (var i=0;i<items.length;i++) {
                  items[i].name = items[i].name.replace(/&amp;/,'&');
                  control.options[control.length] = new Option(items[i].name, items[i].value);
                 }
                 if (!isFirefox) {
                   control.options[control.idx].text = control.title;
                   control.disabled = false;
                 }
                 control.options[control.idx].className = "";
                 control.loaded = 1;
               }
             }
             xmlhttp.send(null);
		  }
		}
		
		refinements_ = function() {
			var refinements=[]
			var params=[]
			var paramname
			refinements.push(escape(this.baserefinement.value))
			var selectorVal
			var fakequery = "";
			
			for (var i in this.checkboxes) {
			  if (this.checkboxes[i].checked) {
			    refinements.push(escape(this.checkboxes[i].value));
			  }
			}
			
			for (var i in this.selectors) {
				if (arguments[0]) { // optionally pass an element to skip
					if (this.selectors[i]==arguments[0]) {
						continue
					}
				}
				selectorVal = this.selectors[i].selectedvalue()
				var temp = this.selectors[i].selectedtext();
				temp = temp.replace(/\(.*?\)/,'');
				temp = temp.replace(/&/,'and');
				if (fakequery.length != 0) {
				  fakequery += ", ";
				}
				fakequery += temp;
				
				var currentVal = ''
				try {
					currentVal = $(this.id+'_Current_'+this.selectors[i].facet).value
				}catch(ex){}
				if (((selectorVal=="ALL")||(selectorVal==""))&&(currentVal))selectorVal=currentVal
				if ((selectorVal!="ALL")&&(selectorVal!="")) {
				   if (this.selectors[i].facet.indexOf("Param:") == 0) {
				      //starts with Param: so this should be added as a parameter not a refinement
				      paramname = this.selectors[i].facet.substring(6)
				      params.push(paramname + "=" + selectorVal);
				   } else {
				      temp = selectorVal.replace(/,/,'');
					  refinements.push(escape(this.selectors[i].facet.replace(/:\/.+$/,''))+":"+escape('"'+temp+'"'))
				   }
				}
			}
			if (params.length > 0) {
			  return '&' + params.join('&') + '&r=' +refinements.join('%20AND%20') + '&fq=' + fakequery;
			} else {
			  return '&r=' +refinements.join('%20AND%20') + '&fq=' + fakequery;
			}
		}
		
		searchurl_ = function() {
			var currentVal = ''
			try {
				currentVal = $(this.id+'_SearchUrl').value
			}catch(ex){
			    currentVal = '/searchResults?q='
			}
			return currentVal
		}
		
		counturl_ = function() {
			var currentVal = ''
			try {
				currentVal = $(this.id+'_CountUrl').value
			}catch(ex){
			    currentVal = '/helpers/finder/getcounts?searchtype=Listing&q='
			}
			return currentVal
		}
		
		docheckbox_ = function() {
		   	for (var k in this.finder.selectors) {
				var aselector = this.finder.selectors[k]
				if (this!=aselector) aselector.fillme()
			}
		}
		
		dosearch_ = function() {
			var executesearchurl = this.finder.searchurl()
			executesearchurl+=this.finder.refinements()
			if (this.finder.target) {
			  window.open(executesearchurl, this.finder.target);
			} else {
			  window.location = executesearchurl;
			}
		}

function addnodes(parentobj, childnode)
{
  if (childnode == null) return;
  for (var i=0;i<childnode.length;i++) {
    if (childnode[i] && childnode[i].id && childnode[i].id.substr(0,7)=='Finder_') {
      parentobj[childnode[i].id] = childnode[i];
    } else {
      addnodes(parentobj, childnode[i].childNodes);
    }
  }
}

		function activateFinders() {
			var formelements = new Array();
			formEls = document.getElementsByTagName('form');
			for (var i=0;i<formEls.length;i++) {
			  formelements.push(formEls[i]);
			}
			formEls = document.getElementsByTagName('span');
			for (var i=0;i<formEls.length;i++) {
			  if (formEls[i].id.substr(0,7)=='Finder_') {
			    //push all child elements onto span
			    addnodes(formEls[i], formEls[i].childNodes);
			    formelements.push(formEls[i]);
			  }
			}
						
			for (var i=0;i<formelements.length;i++) {
				var curform = formelements[i];
				if (curform.id.substr(0,7)=='Jumper_') {
				  curform.selector = document.getElementById(curform.id+'_Select');
				  curform.selector.fillurl = document.getElementById(curform.id+'_URL').value;
				  if (!isFirefox) {
					curform.selector.onmouseover=jumpfill_
					curform.selector.onmousedown=jumpfill_
					curform.selector.idx = 0;
				  } else {
					curform.selector.onfocus=jumpfill_
					curform.selector.idx = 1;
				  }
				  curform.selector.disabled = false;
				  curform.selector.loaded=0;
				  curform.selector.finder=curform;
				}

				if (curform.id.substr(0,7)=='Finder_') {
					try{debuglog('found finder '+curform.id)}catch(ex){}
					if (curform[curform.id+'_Refinement']) curform.baserefinement = curform[curform.id+'_Refinement'];
					curform.showCounts = true
					curform.refinements=refinements_
					curform.searchurl=searchurl_
					curform.counturl=counturl_
					curform.selectors={}
					curform.checkboxes={}
					for (j=1;j<9;j++) {
						if ((curform[curform.id+'_Facet_'+j])&&(curform[curform.id+'_Select_'+j])&&(curform[curform.id+'_Current_'+j])) {
							try{debuglog('selector '+curform[curform.id+'_Select_'+j].id)}catch(ex){}
							var curselect = curform[curform.id+'_Select_'+j]
							curselect.facetnum = j
							curselect.facet = curform[curform.id+'_Facet_'+j].value
							if (curform[curform.id+'_Filter_'+j]) {
							  curselect.filter = new RegExp(curform[curform.id+'_Filter_'+j].value,'i');
							} else {
							  curselect.filter = null;
							}
							curselect.className = curform[curform.id+'_Facet_'+j].className;
							try{debuglog('facet '+curform[curform.id+'_Select_'+j].id+' = '+curselect.facet)}catch(ex){}
							if (matches=curselect.facet.match(/FullCategory:(.+)$/)) {
								curselect.strip = new RegExp('^'+matches[1]+'/*','i')
							}
							curselect.jsonresp = selectorjsonresp_
							curselect.selectedvalue=selectedvalue_
							curselect.selectedtext=selectedtext_
							curselect.doselect=doselect_
							curselect.onchange=doselect_
							curselect.dosearch=dosearch_
							if (curselect.facet.indexOf("Param:") == -1) { //if it starts with param then dont bother filling it
							  if (!isFirefox) {
							    curselect.onmouseover=prefill_
							    curselect.onmousedown=prefill_
							    curselect.idx = 0;
							  } else {
							    curselect.onfocus=prefill_
							    curselect.idx = 1;
							  }
							}
							curselect.loaded=0;
							curselect.fillme=fillme_
							curselect.finder=curform
							curform.selectors[curselect.id]=curselect
							curselect.options[0].selected = true;
							curselect.blur();
							curselect.disabled = false;
						}
					}
					for (j=1;j<9;j++) {
					    var curcheckbox = document.getElementById(curform.id+'_Checkbox_'+j);
						if (curcheckbox) {
						    curform.checkboxes[curcheckbox.id]=curcheckbox			
							curcheckbox.onchange=docheckbox_
							curcheckbox.finder=curform
						}
					}

//					for(var k in curform.selectors) {
//						curform.selectors[k].fillme()
//					}
                    if ($(curform.id+'_Go')) {
					  $(curform.id+'_Go').finder=curform
					  $(curform.id+'_Go').onclick=dosearch_
					}
				}
			}
		}
		var oldonload = window.onload
		if (typeof window.onload != 'function') { 
			window.onload = activateFinders
		} else { 
			window.onload = function() { 
				oldonload()
				activateFinders()
			}
		}
	}()
}

function getLatLongFromPostal(field, selectedform)
{
   var postalcode = field.value.toLowerCase();
   curform = selectedform; //set global var with current form so we can set hidden fields in call back

   document.getElementById(curform + "_MapButton").disabled = true;
   document.getElementById(curform + "_FindButton").disabled = true;
   
   //if it doesnt look like a postalcode alert
   if (!postalcode.match(/[a-z]\d[a-z]\s?\d[a-z]\d/)) {
     alert("Sorry this doesnt look like a postalcode [A1B2C3] or [A1B 2C3]");
     field.focus();
   }
   
   postalcode = postalcode.replace(/\s/g, '');

   var url = "http://maps.google.com/maps/geo?q=" + postalcode + "&callback=georesults&output=json&key=" + GMapKey;

   loadContent(url);
}

function loadContent(file){
  var head = document.getElementsByTagName('head').item(0);
  var scriptTag = document.getElementById('loadScript');
  if(scriptTag) {
    head.removeChild(scriptTag);
  }
  script = document.createElement('script');
  script.src = file;
  script.type = 'text/javascript';
  script.id = 'loadScript';
  head.appendChild(script);
}

function georesults(obj)
{
   if (obj.Status.code == 200) {
     document.getElementById(curform + "_Latitude").value = obj.Placemark[0].Point.coordinates[1];
     document.getElementById(curform + "_Longitude").value = obj.Placemark[0].Point.coordinates[0];
   } else {
     alert("error loading postalcode: " + obj.name);
   }
   document.getElementById(curform + "_MapButton").disabled = false;
   document.getElementById(curform + "_FindButton").disabled = false;
}

function findersearch(finder)
{
  var refinements = "&r=" + document.getElementById(finder + "_Refinement").value;
  var latitude = document.getElementById(finder + "_Latitude").value;
  var longitude = document.getElementById(finder + "_Longitude").value;
  var qname = document.getElementById(finder + "_Name").value;
  var finderOBJ = document.getElementById(finder + "_Select_1").finder;

  var query = finderOBJ.refinements();
  
  if (qname) {
    query += "&r=Title:%22" + qname + "%22";
  }
  if (latitude && longitude) {
    query += "&SortBy=Proximity:LatLong:" + latitude + ":" + longitude;
  }
  
  var searchurl = document.getElementById(finder + "_SearchUrl").value  + query;
  document.location.href = searchurl;
  
  return false;
}

function mapsearch(finder)
{
  var refinements = "&r=" + document.getElementById(finder + "_Refinement").value;
  var latitude = document.getElementById(finder + "_Latitude").value;
  var longitude = document.getElementById(finder + "_Longitude").value;
  var qname = document.getElementById(finder + "_Name").value;
  var finderOBJ = document.getElementById(finder + "_Select_1").finder;

  var query = finderOBJ.refinements();
  
  if (qname) {
    query += "&r=Title:%22" + qname + "%22";
  }
  if (latitude && longitude) {
    query += "&SortBy=Proximity:LatLong:" + latitude + ":" + longitude;
  }
  
  var searchurl = document.getElementById(finder + "_MapSearchUrl").value  + query;
  document.location.href = searchurl;
  
  return false;
}

var curform = "";

	switch (window.location.hostname) {
		case "toronto.com":
			GMapKey = "ABQIAAAAejUldDUpOvZzkh2F748ThBTPwb3v1jdWUWh9BONpGYulgmES_RSASjDld3h8gZjBJ-lbRaFPtnVrlA"
			break
		case "www.toronto.com":
			GMapKey = "ABQIAAAAejUldDUpOvZzkh2F748ThBQE9nmXdj1zNvUWab6OVBXy6KvMcRTaqGlFpXHmi0-j6JT3DkbrVr7cLg"
			break
		case "app2.tordigi.com":
			GMapKey = "ABQIAAAAejUldDUpOvZzkh2F748ThBR6HCPNMHA__Jxnw2fnApUtxGq-0RQuxoIupNVptehvG3rsZY6-G5Ga3g"
			break
		case "toronto.qa.torstardigital.net":
			GMapKey = "ABQIAAAAejUldDUpOvZzkh2F748ThBRjm_jasVLV9eY3g20ptLwmCBN5ehR-zTgaS1ohrEWrbyaZtA_JRYGxmQ"
			break
		case "toronto.staging.torstardigital.net":
			GMapKey = "ABQIAAAAejUldDUpOvZzkh2F748ThBSyCPAXkq1arLelFEurottzfxF9MBRJYbQ4K5jtvtgv1ikr0HX5_R74fQ"
			break
		case "toronto.td.torstar.net":
			GMapKey = "ABQIAAAAejUldDUpOvZzkh2F748ThBTnpPKrC-4GYIVEtRnlg-T-Xi-YkBQAbfFEIXJaqc2gneCK808ZS18w2Q"
			break
		case "localhost":  // on port 80 only
			GMapKey = "ABQIAAAAejUldDUpOvZzkh2F748ThBT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQzoIxhFMJCopdcwCF4xpWwGlxIEA"
			break
		default:
			GMapKey = ""
	}
	
	
function notsofindersearch(notsofindername)
{
    var matcher = new RegExp('^' + notsofindername, 'i');
    var remover = new RegExp('^(' + notsofindername + '_)', 'i');
    var f = document.forms['aspnetForm'];
    var searchurl = undefined;
    var params = {};
    
    for(var itemnum in f.elements)
    {
        var item = f.elements[itemnum];
        if(item == undefined)
            continue;
        if(matcher.test(item.name))
        {
            var paramname = item.name.replace(remover, '');
            if(paramname === 'SearchUrl')
            {
                searchurl = item.value;
            } else {
                if(item.value !== '')
                    params[paramname] = item.value;
            }
        }
    }
    
    var urlparamstring = '';
        
    var separator = '';
    for ( var name in params)
    {
        urlparamstring = urlparamstring + separator + name + '=' + escape(params[name]);
        separator = '&';
    }
    
    if(searchurl !== undefined)
        window.open(searchurl + "?" + urlparamstring, '_blank', '');
    return false;
}
