GeocodeHelper = (function() {
	var GeocodeHelper = function(formid, config) {
		this.init(formid, config);
	};
  
	GeocodeHelper.prototype = {
		init: function(formid, config) {
			this.form = document.getElementById(formid);			
			this.height = 100;
			this.places = new Array();
			
			this.type = config.type;
			this.baseURL = config.baseURL;
			this.messages = config.messages;
			this.previewId = config.previewId;
			this.pid = config.pid;
			this.locale = config.locale;
			this.country = config.defaultCountry;
			
			this.ambigPanel = new YAHOO.widget.Panel('ambigPanel', { width:'400px', visible:false, fixedcenter:true, draggable:false, close:true, modal:true } );
			this.ambigPanel.setHeader(this.messages.ambigous);
			
			if(document.getElementById('input_addressSel')) {
				document.getElementById('input_addressSel').value = 'SHOW_START_AND_END';
			}
			
			if(this.type == 'flexiSbirV4V5') { // quickfix for version 4/5
				if(this.pid == 'pkt') {
					//this.toggleResultList("");
				}
			} else {
				if(document.getElementById('combSelect') && document.getElementById('combSelect').length < 2) {
					document.getElementById('combSelect_box').style.visibility = 'hidden';
				}
			}
			
			if(document.getElementById('input_searchboxType')) {
				document.getElementById('input_searchboxType').value = config.default_searchboxType;
			}
			
		},
		showDemo: function(tab, resultType, tabsParam) {
			var tabs;
			var add = '';
			
			if(this.type == 'flexiSbirV4V5') {
				var pData = YAHOO.searchTerms.searchTermTable.getFirstData();
				
				if(YAHOO.lang.isObject(pData)) {
					add += '&where='+Base64.encode(pData[0].where)+'&what='+Base64.encode(pData[0].term ? pData[0].term : pData[0].alias);
				}
				
				tabs = tabsParam;
				
			} else {
			
				if (tabsParam) {
					tabs = tabsParam;
					if(tabsParam == 'WP') {	tab = 'wp'; }
				} else {
					//tabs = document.getElementById('combSelect')[document.getElementById('combSelect').selectedIndex].value;
					tabs = document.getElementById('combSelect').value;
				}
				
				if(document.getElementById('input_address')) {
					add += '&address='+document.getElementById('input_address').value+'&where='+Base64.encode(document.getElementById('input_address').value);
				}
	
				if(document.getElementById('input_what')) {
					add += '&dummy=true&what='+Base64.encode(document.getElementById('input_what').value);
				}
			}
			window.open('demo.do?pid='+this.pid+'&locale='+this.locale+'&tabs='+tabs+'&tab='+tab+'&resultType='+resultType+'&page=1'+add);
		},
		toggleResultList: function(tabs) {
			
			var $D = YAHOO.util.Dom;
			
			if(tabs == "") {
				//tabs = document.getElementById('combSelect')[document.getElementById('combSelect').selectedIndex].value;
				tabs = document.getElementById('combSelect').value;
			}
			
			if (tabs == 'YP') {
				$D.setStyle('WP_select', 'display', 'none');
				$D.setStyle('YP_select', 'display', 'block');
			} else if (tabs == 'WP') {
				$D.setStyle('YP_select', 'display', 'none');
				$D.setStyle('WP_select', 'display', 'block');
			} else {
				$D.setStyle('YP_select', 'display', 'block');
				$D.setStyle('WP_select', 'display', 'block');
			}
			
			if(YAHOO.lang.isObject(YAHOO.searchTerms))
				if(YAHOO.searchTerms.searchTermTable)
					YAHOO.searchTerms.searchTermTable.updatePreview();
			
		},
		showPreview: function() {
			if (this.previewId == '') {	return; }
			
			var $D = YAHOO.util.Dom;
			var addressSelection = '';
			var frameObj = document.getElementById(this.previewId);
			if(this.type == 'flexiSbirV4V5') {
				//var tabs = document.getElementById('combSelect')[document.getElementById('combSelect').selectedIndex].value;
				var tabs = document.getElementById('combSelect').value;
				frameObj.src = 'sbFlexiSbirV4V5.do?pid=' + this.pid + '&locale=' + this.locale + '&tabs='+tabs;
				this.toggleResultList('');
			} else {
				if (document.getElementById('sizeSelect')) 
					var data = (document.getElementById('sizeSelect')[document.getElementById('sizeSelect').selectedIndex].id).split('_');
				else {
					/* store locator */				
					document.getElementById('input_what').value = document.getElementById('input_fixedWhat').value ? document.getElementById('input_fixedWhat').value : "";
					
					var width = document.getElementById('map_width').value ? document.getElementById('map_width').value : document.getElementById('map_width_min').value;
					var height = document.getElementById('map_height').value ? document.getElementById('map_height').value : document.getElementById('map_height_min').value;
					var data = false;
				}
	
				if (this.type == 'resultlist') {
					//var tabs = document.getElementById('combSelect')[document.getElementById('combSelect').selectedIndex].value;
					var tabs = document.getElementById('combSelect').value;
					var address = '';
					this.toggleResultList(tabs);
					if(document.getElementById('input_address')) {
						address = '&address=' + encodeURIComponent(document.getElementById('input_address').value);
					}
					
					frameObj.src = 'preview.jsp?pid=' + this.pid + '&type=' + data[1] + '&locale=' + this.locale + '&tabs=' + tabs + address;
				} else {
					if (data) {
						if (this.form.elements['toolBoxSelection.addressSelection']) {
							addressSelection = this.form.elements['toolBoxSelection.addressSelection'].value;
							frameObj.src = 'searchboxRoute.do?pid=' + this.pid + '&locale=' + this.locale + '&width=' + data[2] + '&height=' + data[3] + '&addressSelection=' + addressSelection + '&address=' + encodeURIComponent(document.getElementById('input_address').value);
						}
						else {
							frameObj.src = 'searchboxMap.do?pid=' + this.pid + '&locale=' + this.locale + '&width=' + data[2] + '&height=' + data[3] + '&address=' + encodeURIComponent(document.getElementById('input_address').value);
						}
					}
					else {
						/* store locator */
						var categories = this.form.categories ? this.form.categories : "";
						var sel_cat = '';
						
						if (categories.length > 0) {
							for (i=0; i<categories.length; i++) {
								if (categories[i].checked == true) {
									sel_cat += '&cat=' + categories[i].value;
								}
							}
						}
						var searchboxType = document.getElementById("input_searchboxType").value;
						var zoom = (document.getElementById('zoom')[document.getElementById('zoom').selectedIndex].value);
						
						var newSrc = 'searchboxStoreLocator.do?pid=' + this.pid + '&locale=' + this.locale + '&width=' + width + '&height=' + height + '&address=' + encodeURIComponent(document.getElementById('input_address').value) + '&what=' + document.getElementById('input_what').value + sel_cat + '&zoom=' + zoom + '&slType=' + searchboxType + '&lat='+document.getElementById('input_lat').value+'&lng='+document.getElementById('input_lng').value;
						if(frameObj.src != newSrc) {
							frameObj.src = newSrc;
						}
					}
				}
				
				frameObj.width = data[2] ? data[2] : width +'px';
				frameObj.height = data[3] ? data[3] : height +'px';
			}
		},
		switchBox: function(div_show, div_hide, sel) {
			var boxToHide = div_hide.split(',');
			var height = this.height;

			if(sel == "FIX_ALL")
				var height = 200;
				
			if (sel == "FULL" || sel == "FIX_ALL" || sel == "FIX_WHERE") {
				document.getElementById('input_searchboxType').value = sel;
				if (sel == "FULL" || sel == "FIX_WHERE") {
					document.getElementById('input_fixedWhat').value="";
				}
			}
			else 
				document.getElementById('input_addressSel').value = sel;

			if(div_show != '') {
				var animShow = new YAHOO.util.Anim('box_'+div_show, { height: { to: height } }, 0.5);		
				animShow.onComplete.subscribe(function(e, a, obj) {
					document.getElementById(obj.focusElem).focus();
					geo.showPreview();			
				}, { focusElem: 'input_'+div_show });
				animShow.animate();
			}
	
			for(i=0; i<boxToHide.length; i++) {
				var animHide = new YAHOO.util.Anim('box_'+boxToHide[i], { height: { to: 1 } }, 0.5);
				animHide.animate();
				if(div_show == '') {
					animHide.onComplete.subscribe(function(e, a, obj) {
						geo.showPreview();			
					});
				}
			}			
		},
		showOnMap: function(type) {
			window.open(this.baseURL['ml']+'&where='+encodeURIComponent(document.getElementById('input_address').value));
		},
		setAmbigous: function(num, type) {
			this.setPlace(this.places[num], type);
			this.ambigPanel.hide();	
		},
		copyAddress: function(address, type) {			
			/* todo change this */
			var typeAry = new Array();
			typeAry[0] = "full";
			typeAry[1] = "where";
			typeAry[2] = "fixedWhere";
			
			for(var i=0; i<typeAry.length; i++) {
				if(typeAry[i] != type) {
					YAHOO.util.Dom.removeClass('input_'+typeAry[i], 'loading');
					YAHOO.util.Dom.removeClass('input_'+typeAry[i], 'iserror');
					YAHOO.util.Dom.addClass('input_'+typeAry[i], 'isok');										
					document.getElementById('input_'+typeAry[i]).value = address;
				}
			}
		},
		setPlace: function(place, type) {
			var fieldid = 'input_'+type;
			
			if (document.getElementById('input_lat')) {
				document.getElementById('input_lat').value = place.coordinate.wgs84yLat;
			}
			if (document.getElementById('input_lng')) {
				document.getElementById('input_lng').value = place.coordinate.wgs84xLng;
			}
			if (document.getElementById('input_address')) {
				document.getElementById('input_address').value = place.address;
			}
			
			YAHOO.util.Dom.removeClass(fieldid, 'loading');
			YAHOO.util.Dom.removeClass(fieldid, 'iserror');
			YAHOO.util.Dom.addClass(fieldid, 'isok');					
			
			document.getElementById(fieldid).value = place.address;
			document.getElementById('showmap_'+type).style.display = 'block';
			document.getElementById('msg_'+type).innerHTML = '';
			
			if(this.form.name == 'selForm_storeLocator')
				this.copyAddress(place.address, type);
			
			if(this.type == 'flexiSbirV4V5')
				YAHOO.searchTerms.searchTermTable.updatePreview();
			else
				this.showPreview();
		},
		geocode: function(type) {
			var callback = {
				success: function(o) {
					var type    = o.argument[1];
					var that    = o.argument[0];
					var fieldid = 'input_'+type;

					YAHOO.util.Dom.removeClass(fieldid, 'loading');			
					
					try {
						var json = YAHOO.lang.JSON.parse(o.responseText);
					} catch(e) {
						YAHOO.util.Dom.removeClass(fieldid, 'isok');
						YAHOO.util.Dom.addClass(fieldid, 'iserror');
						document.getElementById('showmap_'+type).style.display = 'none';
						document.getElementById('msg_'+type).innerHTML = that.messages.notfound;
						return;
					}
					
					var placesFound = json.places.length;
						
					if(placesFound > 1) {
						that.places = json.places;
							
						var placesHtml = '';
						for(var i=0; i<json.places.length; i++) {
							placesHtml += '<li><a href="javascript:void(0);" onclick="geo.setAmbigous('+i+', \''+type+'\')">'+json.places[i].address+'</a></li>';
						}
								
						that.ambigPanel.setBody('<div class="scrollable"><ul>'+placesHtml+'</ul></div>'); 
						that.ambigPanel.render('container');
						that.ambigPanel.show();
					} else if(placesFound == 1) {
						that.setPlace(json.places[0], type);
					} else {
						YAHOO.util.Dom.removeClass(fieldid, 'isok');
						YAHOO.util.Dom.addClass(fieldid, 'iserror');
						document.getElementById('showmap_'+type).style.display = 'none';
						document.getElementById('msg_'+type).innerHTML = that.messages.notfound;
					}			
				},
				failure: function(o) {
					var that = o.argument[0];					
					YAHOO.util.Dom.removeClass(fieldid, 'isok');
					YAHOO.util.Dom.addClass(fieldid, 'iserror');					
					document.getElementById('showmap_'+type).style.display = 'none';
					document.getElementById('msg_'+type).innerHTML = that.messages.notfound;
				},
				timeout: 10000,
				argument: [this, type]
			};
			
			var addressField = document.getElementById('input_'+type);
			
			YAHOO.util.Dom.addClass(addressField, 'loading');
			YAHOO.util.Connect.asyncRequest('GET', 'proxy.jsp?action=geocode&country='+this.country+'&address='+encodeURIComponent(addressField.value), callback);
		},
		validateForm: function() {
			if (this.form.elements['toolBoxSelection.addressSelection']) {
				var val = this.form.elements['toolBoxSelection.addressSelection'].value;				
				if (val == 'FIX_START' || val == 'FIX_END') {
					if (this.form.elements['toolBoxSelection.address'].value == '') {
						alert(this.messages.formerror);
						return;
					}
				}
			} else {
				if (this.form.elements['toolBoxSelection.address'].value == '') {
					alert(this.messages.formerror);
					return;
				}
			}
			document.getElementById('selForm').submit();
		}, 
		validateMapForm: function() {
			/* validate map width and height for store locator */
			if(this.form.elements['input_searchboxType'].value == 'FULL') {
				
				if (document.getElementById('input_full').value == '') {
					document.getElementById('input_full').focus();
					alert(this.messages.formerror);
					return;
				} 
			}
			if(this.form.elements['input_searchboxType'].value == 'FIX_WHERE') {
				
				if (document.getElementById('input_address').value == '') {
					document.getElementById('input_where').focus();
					alert(this.messages.formerror);
					return;
				}
			}
			if(document.getElementById('input_searchboxType').value == 'FIX_ALL'){
				if (this.form.elements['input_what'].value == '') {
					document.getElementById('input_fixedWhat').focus();
					alert(this.messages.formerror_what);
					return;
				}
				if (document.getElementById('input_address').value == '') {
					document.getElementById('input_fixedWhere').focus();
					alert(this.messages.formerror);
					return;
				}
			}			
			if(this.form.elements['width'].value == '')
				this.form.elements['width'].value = this.form.elements['map_width_min'].value;
			if(this.form.elements['height'].value == '')
				this.form.elements['height'].value = this.form.elements['map_height_min'].value;
			
			document.getElementById('selForm_storeLocator').submit();
		}
	};
	return GeocodeHelper;
})();


Categories = (function() {
	var Categories = function() {
		this.init();
	};
  
	Categories.prototype = {
		init: function() {
			this.categoryAry = new Array();
		},
		checkCatAry: function(obj) {		
			for (var i = 0; i < this.categoryAry.length; i++) {
				if (this.categoryAry[i].id == obj.id) {
					this.categoryAry.splice(i, 1);
					return true;
				}
			}
			return false;			
		}, 
		updateCat: function(obj) {			
			var selectedCategories = "";
			
			if(this.checkCatAry(obj) == false)
				this.categoryAry.push(obj);
				
			this.categoryAry.sort();
			for (var i = 0; i < this.categoryAry.length; i++) {
					selectedCategories += '<li>'+this.categoryAry[i].name+'</li>';		
			}
			selectedCategories += '<li id="li_link_more">More</li>';
		}
	};
	return Categories;
})();

function gotoRadio(form, radio) {
	var r = document.forms[form].elements[radio];
	for (i=0; i<r.length; i++) {
		if (r[i].checked) {
			location.href = r[i].value;
			return;
		}
	}
}


var Base64 = {
    _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
    encode: function(input){
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;
        
        input = Base64._utf8_encode(input);
        
		while (i < input.length) {
            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);
            
            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;
            
            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
				enc4 = 64;
            }
            
            output = output + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);            
        }
        
        return output;
    },
    decode: function(input){
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;
        
        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
        
        while (i < input.length) {
            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));
            
            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;
            
            output = output + String.fromCharCode(chr1);
            
            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }
        }
        
        output = Base64._utf8_decode(output);
        return output;
    },
    _utf8_encode: function(string){
        string = string.replace(/\r\n/g, "\n");
        var utftext = "";
        
        for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);
            
            if (c < 128) {
                utftext += String.fromCharCode(c);
            } else if ((c > 127) && (c < 2048)) {
            	utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            } else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
        }
        
        return utftext;
    },
    _utf8_decode: function(utftext){
        var string = "";
        var i = 0;
        var c = 0;
		var c1 = 0;
		var c2 = 0;
        
        while (i < utftext.length) {
            c = utftext.charCodeAt(i);
            
            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            } else if ((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i + 1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			} else {
				c2 = utftext.charCodeAt(i + 1);
				c3 = utftext.charCodeAt(i + 2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
        }
        
        return string;
    }
};

function checkMapFormat(elem) {
	var format = new Array();
	format["map_width"] = new Array();
	format["map_width"]["min"] = 350;
	format["map_width"]["max"] = 1280;
	format["map_height"] = new Array();
	format["map_height"]["min"] = 400;
	format["map_height"]["max"] = 1024;
		
	if (elem.value) {
		if (elem.value < format[elem.id]["min"] || elem.value > format[elem.id]["max"]) {
			if (elem.id == "map_width") 
				alert("alert width");
			else 
				alert("alert height");
		}
	}
	elem.focus();
	geo.showPreview();
}

// === flexisbir v4/5
function changeFrameWidth(elem) {
	var wMin = 200;
	var wMax = 400;
	
	if(elem.value) {
		if(elem.value < wMin) {
			alert("width "+elem.value+"px < " +wMin);
			return;
		}
		if(elem.value > wMax) {
			alert("width "+elem.value+"px > " +wMax);
			return;
		}
	}
	
	document.getElementById('previewFrame').width = elem.value;
}

function assignData(elem) {
	document.getElementById(elem.id).value = elem.value;
	geo.showPreview();
}

