StoreSelector = Class.create();
StoreSelector.prototype = {	

	stateDictionary: null,
	
	states: [],
	
	locationSelector: [],
	storeSelector: [],
	submitButton: false,
	cookiedLocation: false,
	cookiedStore: false,
	activateButton: false,
	
	// linkType options: genius, procare, business, personal, promo, workshop, and store.
	initialize: function(country, locationSelector, storeSelector, submitButton, linkType, delegate) {
		
		this.locationSelector = locationSelector;
		this.storeSelector = storeSelector;
		this.submitButton = submitButton;
		this.linkType = linkType;
		this.delegate = delegate;
		
		if(Cookie.get('retail_storenumb')) this.cookiedStore = Cookie.get('retail_storenumb');
		
		this.stores = this.createStores(country);
		this.showStores(this.stores);
		if(this.cookiedStore && this.submitButton) this.submitButton.addClassName('active');
				
		Event.observe(this.storeSelector, 'change', function(event) {

			var selectedIndex = this.storeSelector.selectedIndex;
			var selectedStore = this.storeSelector.getElementsByTagName('option')[selectedIndex];
			
			if (typeof(selectedStore.value) != 'undefined' && selectedIndex != 0) {
				if(!this.submitButton) {
					if(Cookie.get('retail_storenumb')) Cookie.erase('retail_storenumb');
					Cookie.set('retail_storenumb', selectedStore.getAttribute('name'), 14);
					
					window.location = selectedStore.value;
				} else { 
					this.submitButton.addClassName('active');
				}
			} else {
				if(this.submitButton) this.submitButton.removeClassName('active');
			}
			
		}.bindAsEventListener(this));
		
		if(this.submitButton && this.linkType != 'phone') {
			Event.observe(this.submitButton, 'click', function(event) {
				Event.stop(event);
				
				var selectedIndex = this.storeSelector.selectedIndex;
				var selectedStore = this.storeSelector.getElementsByTagName('option')[selectedIndex];
				
				if(this.submitButton.hasClassName('active') && typeof(selectedStore.value) != 'undefined') {
					if(Cookie.get('retail_storenumb')) Cookie.erase('retail_storenumb');
					Cookie.set('retail_storenumb', selectedStore.getAttribute('name'), 14);
					
					window.location = selectedStore.value;
				} else {
					if(typeof(selectedStore.value) == 'undefined') this.locationSelector.focus();
					else this.storeSelector.focus();
				}
			}.bindAsEventListener(this));
		}
		
		if(this.submitButton && this.linkType == 'phone') {
			Event.observe(this.submitButton, 'click', function(event) {
				Event.stop(event);
								
				var selectedIndex = this.storeSelector.selectedIndex;
				var selectedStore = this.storeSelector.getElementsByTagName('option')[selectedIndex];
				
				if(this.submitButton.hasClassName('active') && typeof(selectedStore.value) != 'undefined') {
					if(Cookie.get('retail_storenumb')) Cookie.erase('retail_storenumb');
					Cookie.set('retail_storenumb', selectedStore.getAttribute('name'), 14);
					
					this.sendReq($H({'store':selectedStore.value}));
				} else {
					if(typeof(selectedState.value) == 'undefined') this.locationSelector.focus();
					else this.storeSelector.focus();
				}
				
			}.bindAsEventListener(this));
			
			Event.observe($('phoneToggle'), 'click', this.phoneToggleClicked.bindAsEventListener(this));
		}
		
	},
	
	phoneToggleClicked: function(event) {
				if(event) Event.stop(event);
				var element = $('phoneResults');
				if(element) {
					element.hide();
				}
				element = $('phoneFields');
				if(element) {
					element.show();
				}
				//this.changeOverlayHeight($('phoneFields'));
			} ,
	
	sendReq: function(params) {
		// send request for store workshops with the R#
		var send = new Ajax.Request('/retail/scripts/storewidget.php', {
			method: 'POST', 
			parameters: params,
			onComplete: this.acknowledgeComplete.bind(this)
		})
	},
	
	acknowledgeComplete: function(request) {
		var jsonText = request.responseText;
		var result = this.scopedEval(jsonText);
		if(result) {
			var storeInfo = result[0];
			this.setStoreInfo(storeInfo);
			$('phoneFields').hide();
			$('phoneResults').show();
			//this.changeOverlayHeight($('phoneResults'));
		}
	},
	
	changeOverlayHeight: function(content) {
		var locationOverlay = $$('.overlay.locationoverlay')[0];
		var locationOverlayShadow = $$('.overlayshadow.locationoverlay')[0];
		var overlayHeight = AC.OverlayPanel.overlay.height();
		var resultsHeight = content.getHeight();
		AC.OverlayPanel.overlay.setHeight(resultsHeight);
	},
	
	scopedEval: function(stringValue) {
		try {
			//alert(stringValue);
			return (function() {return eval("("+stringValue+")");})();
		}
		catch(e) {
			//alert('Error: '+e);
			return null;
		}
	},
	
	setStoreInfo: function(storeInfo) {
		var phoneResults = $('phoneResults');
		phoneResults.down('.fn').innerHTML = storeInfo.storeName;
		phoneResults.down('.street-address').innerHTML = storeInfo.address1;
		phoneResults.down('.extended-address').innerHTML = storeInfo.address2;
		phoneResults.down('.locality').innerHTML = storeInfo.city;
		phoneResults.down('.region').innerHTML = storeInfo.state;
		phoneResults.down('.postal-code').innerHTML = storeInfo.zip;
		phoneResults.down('.tel').innerHTML = storeInfo.phone;
	},
	
	populateLocationsWithin: function(country) {
		
		this.states = country.getElementsByTagName('state');
		
		this.storeSelector.getElementsByTagName('option')[0].innerHTML = "";
		var myDelegate = this.delegate;
		var hasShouldAddState = myDelegate && (typeof myDelegate.shouldAddStateNamed === "function");
		var shouldAddState = true;
		
		for (var i = 0; i < this.states.length; i++) {
			var state = this.states[i];
			
			var stateCode = state.getAttribute('name');
			var stateName = this.stateDictionary[state.getAttribute('name')].name;
			
			shouldAddState = true;
			if(hasShouldAddState) {
				shouldAddState = myDelegate.shouldAddStateNamed(stateName);
			}
			if(!shouldAddState) continue;

			var selected = (stateCode == this.cookiedLocation) ? true : false;

			var stateOption = this.createOption(stateCode, stateName, selected, '');
			this.locationSelector.appendChild(stateOption);

			this.stateDictionary[stateCode].stores = this.createStores(state);
			if(selected) {
				this.showStores(this.stateDictionary[stateCode].stores);
				this.storeSelector.getElementsByTagName('option')[0].innerHTML = "Choisissez une boutique";
			}
		}
		
		this.locationSelector.getElementsByTagName('option')[0].innerHTML = "Select a State";
		this.locationSelector.removeAttribute('disabled');
		
	},
		
	showStores: function(stores) {

		if(this.submitButton) this.submitButton.removeClassName('active');
		
		this.storeSelector.innerHTML = '';
		
		if(typeof(stores) == 'undefined') {
			this.storeSelector.setAttribute('disabled', 'disabled');
			return;
		}
		
		if(stores.length > 0) {
			
			this.storeSelector.appendChild(this.createOption('', 'Choisissez une boutique', false, ''));
		
			for (var i = 0; i < stores.length; i++) {
				this.storeSelector.appendChild(stores[i].cloneNode(true));
			}
		
			this.storeSelector.removeAttribute('disabled');
		}
		
	},
	
	createStores: function(state) {
		var storeOptions = [];
		var shouldAddStore = true
		var myDelegate = this.delegate;
		var hasShouldAddStore = myDelegate && (typeof myDelegate.shouldAddStoreWithConciergeIdForStateNamed === "function");
		var hasStoreLink = myDelegate && (typeof myDelegate.storeLinkForStoreWithConciergeIdStateNamed === "function");
		var stores = state.getElementsByTagName('store');

		for(var i = 0; i < stores.length; i++ ) {
			var store = stores[i];
			var storeCode = store.getElementsByTagName('appleid')[0].firstChild.nodeValue;
			var storeName = store.getElementsByTagName('city')[0].firstChild.nodeValue + ', ' + store.getElementsByTagName('name')[0].firstChild.nodeValue;
			var selected = (storeCode == this.cookiedStore) ? true : false;
			switch(this.linkType) {
				case 'genius':
					var storeLink = 'http://concierge.apple.com/store/' + storeCode;
					break;
				case 'procare':
					var storeLink = 'http://concierge.apple.com/procare/store/' + storeCode;
					break;
				case 'business':
					var storeLink = 'http://concierge.apple.com/biz/' + storeCode;
					break;
				case 'personal':
					var storeLink = 'http://concierge.apple.com/ps/' + storeCode;
					break;
				case 'promo':
					var storeLink = 'http://concierge.apple.com/promo/store/' + storeCode;
					break;
				case 'workshop':
					var storeLink = 'http://concierge.apple.com/workshops/' + storeCode;
					break;
				case 'phone':
					var storeLink = storeCode;
					break;
				case 'store':
					var storeLink = store.getElementsByTagName('link')[0].firstChild.nodeValue;
					break;
				default:
					var storeLink = store.getElementsByTagName('link')[0].firstChild.nodeValue;
					break;
			}
			
			shouldAddStore = true;
			if(hasShouldAddStore) {
				var stateName = this.stateDictionary[state.getAttribute('name')].name;
				shouldAddStore = myDelegate.shouldAddStoreWithConciergeIdForStateNamed(storeCode, stateName);
			}
			if(!shouldAddStore) continue;

			if(hasStoreLink) {
				storeLink = myDelegate.storeLinkForStoreWithConciergeIdStateNamed(storeCode, stateName);
			}
			
			var storeOption = this.createOption(storeLink, storeName, selected, storeCode);
			if(selected) {
				this.storeSelector.getElementsByTagName('option')[0].innerHTML = "Select a Store";
			}
			storeOptions.push(storeOption);
		}
		
		return storeOptions;
	},

	createOption: function(value, name, selected, storeCode) {
		var option = $(document.createElement('option'));
		if(storeCode != '') option.setAttribute('name', storeCode);
		option.setAttribute('value', value);
		if(selected) option.setAttribute('selected', 'selected');
		option.appendChild(document.createTextNode(name));

		return option;
	}
	
};

// Cookie
var Cookie = {
  set: function(name, value, daysToExpire) {
    var expire = '';
    if (daysToExpire != undefined) {
      var d = new Date();
      d.setTime(d.getTime() + (86400000 * parseFloat(daysToExpire)));
      expire = '; expires=' + d.toGMTString();
	  path = '; path=/';
    }
    return (document.cookie = escape(name) + '=' + escape(value || '') + expire + path);
  },
  get: function(name) {
    var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + escape(name) + '=([^;\\s]*)'));
    return (cookie ? unescape(cookie[2]) : null);
  },
  erase: function(name) {
    var cookie = Cookie.get(name) || true;
    Cookie.set(name, '', -1);
    return cookie;
  },
  accept: function() {
    if (typeof navigator.cookieEnabled == 'boolean') {
      return navigator.cookieEnabled;
    }
    Cookie.set('_test', '1');
    return (Cookie.erase('_test') === '1');
  }
};

