/**
 * @filename ActivityFormFields.js
 * 
 * @description Class to get form fields for activities
 * 
 * @author Michael Bina
 * @email michael.bina@garmin.com
 *
 * Copyright(c) 2008, Garmin International
 */
Ext.namespace("Garmin", "Garmin.form");

/**
 * ActivityFormFieldsConstants.formFieldNames
 */
var ActivityFormFieldsConstants = {
	// Form Field IDs
	formFieldNames: {
		ACTIVITY_TYPE: 'activityTypeField',
		EVENT_TYPE: 'eventTypeField',
		TIME_ZONE: 'timeZoneField'
	},
	
	httpRequestStrings: {
		SAVING: bundle_resource.saving,
		ACTIVITY_NAME_FAIL: bundle_resource.fail_name,
		ACTIVITY_DESC_FAIL: bundle_resource.fail_desc,
		ACTIVITY_TYPE_FAIL: bundle_resource.fail_type,
		EVENT_TYPE_FAIL: bundle_resource.fail_event,
		TIME_ZONE_FAIL: bundle_resource.fail_time
	},
	
	EDITABLE_FIELD_CLASS_NAME: 'editable',
		
	COMBO_BOX_DEFAULT_CONFIG_OPTIONS: {
		editable: false,
        typeAhead: false,
        triggerAction: 'all',
        selectOnFocus: false,
		disableKeyFilter: true,
		forceSelection: true,
        resizable:false,
		readOnly: true
	}
};

/**
 * The Garmin.form.ActivityFormFields class contains reusable versions of
 * all form fields related to activities.
 * 
 */
Garmin.form.ActivityFormFields = {

	alertError: function(msg) {
		Ext.MessageBox.show({
			title: 'Error',
			msg: msg,
			buttons: Ext.MessageBox.OK,
			icon: Ext.MessageBox.ERROR
		});
	},

    /**
     * @param config {Object} configuration options, not required
     * @param config.autoHyperlink {Boolean} if true, turns all URLs into hyperlinks using href tag.
     * @param config.blankText {String} text that shows when field is blank
     * @param config.tooltipText {String} tooltip text for the field
     */
	makeFieldEditable: function(element, formFieldObject, updateFunction, config) {
		var editor = new Ext.Editor(formFieldObject, {
		    cancelOnEsc: true,
		    completeOnEnter: true,
		    updateEl: true,
		    ignoreNoChange: true,
		    alignment: "tl"
		});

		if(config.tooltipText !== null) {
			Ext.QuickTips.init();
			Ext.QuickTips.register({
				text: config.tooltipText,
				target: element.id
			});
		}

		element.on('click', function(event){
		    if(config.blankText != null && config.blankText == element.dom.innerHTML.strip()) {
                editor.startEdit(element.dom, ''); // initialize the editor with no text
		    } else {
		        editor.startEdit(element.dom, element.dom.innerHTML.strip()); // initialize the editor with DOM's inner HTML text 
            } 
		}.bind(this));
		
		element.addClass(ActivityFormFieldsConstants.EDITABLE_FIELD_CLASS_NAME);
		
		editor.on('complete', function(editorObj, newValue, oldValue) {
			var newValueWords = [];
			element.dom.innerHTML = "Saving...";
			
			// Turn any URLs in string into HTML hyperlinks
			if(config.autoHyperlink) {
			    newValueWords = newValue.split(' ');
			    for( var i=0; i < newValueWords.length; i++) {
			        if( newValueWords[i].startsWith('http://')) {
			            var hyperlink = '<a href="'+ newValueWords[i] +'" target="_blank">'+ newValueWords[i] +'</a>';
			            newValueWords[i] = hyperlink;
			        }
			        else if( newValueWords[i].startsWith('www.')) {
			            var hyperlink = '<a href="http://'+ newValueWords[i] +'" target="_blank">'+ newValueWords[i] +'</a>';
			            newValueWords[i] = hyperlink;
			        }
			    }
			    
			    newValue = newValueWords.join(' ');
			}
			updateFunction(newValue, oldValue);
		});
		
		editor.on('beforecomplete', function(editorObj, newValue, oldValue) {
		    var finishEdit = true;
		    // Cancel if just spaces
		    if( newValue != null && newValue.strip() == '') {
		        editor.cancelEdit();
		        finishEdit = false;
		    }
		    return finishEdit;
		});
		return editor;
	},

	/**
	 * 
	 * @param {Object} Ext.form.ComboBox config
	 * 
	 * @return {Ext.form.ComboBox}
	 */
	getActivityTypesCombo: function(config, includeAll, includeUncategorized) {
		var store = this._getActivityTypesStore(includeAll, includeUncategorized);
		var combo = new Ext.form.ComboBox(Ext.apply(config,Ext.apply(ActivityFormFieldsConstants.COMBO_BOX_DEFAULT_CONFIG_OPTIONS, {
				name: ActivityFormFieldsConstants.formFieldNames.ACTIVITY_TYPE,
				emptyText: bundle_resource.pick_activity,
		        store: store,
				mode: 'local',
		        displayField:'defaultDisplay',
				valueField:'key'
			}))
		);
		return combo;
	},

	/**
	 * 
	 * @return {Ext.data.Store}
	 */
	_getActivityTypesStore : function(includeAll, includeUncategorized) {
		var activityTypesArray = [];
		if(includeAll) {
			activityTypesArray.push({
				"key":"all",
				"display": "All",
				"isDefault": "true"
			});
		}
		if(includeUncategorized) {
			activityTypesArray.push({
				"key":"uncategorized",
				"display": "Uncategorized"
			});
		}
	//TODO: CONNECT-2219 remove these hard coded values 
		var activityTypeData = {"data":
			{"activityTypes":
				activityTypesArray.concat(
					[
					  {
					    "key": "street_running",
					    "display": "Street Running",
					    "parent": {
					      "key": "running",
					      "display": "Running"
					    }
					  },
					  {
					    "key": "trail_running",
					    "display": "Trail Running",
					    "parent": {
					      "key": "running",
					      "display": "Running"
					    }
					  },
					  {
					    "key": "track_running",
					    "display": "Track Running",
					    "parent": {
					      "key": "running",
					      "display": "Running"
					    }
					  },
					  {
					    "key": "road_biking",
					    "display": "Road Biking",
					    "parent": {
					      "key": "biking",
					      "display": "Biking"
					    }
					  },
					  {
					    "key": "mountain_biking",
					    "display": "Mountain Biking",
					    "parent": {
					      "key": "biking",
					      "display": "Biking"
					    }
					  },
					  {
					    "key": "casual_walking",
					    "display": "Casual Walking",
					    "parent": {
					      "key": "walking",
					      "display": "Walking"
					    }
					  },
					  {
					    "key": "speed_walking",
					    "display": "Speed Walking",
					    "parent": {
					      "key": "walking",
					      "display": "Walking"
					    }
					  },
					  {
					    "key": "hiking",
					    "display": "Hiking",
					    "parent": {
					      "key": "all",
					      "display": "All"
					    }
					  },
					  {
					    "key": "strength_training",
					    "display": "Strength Training",
					    "parent": {
					      "key": "indoor_training",
					      "display": "Indoor Training"
					    }
					  },
					  {
					    "key": "indoor_cardio",
					    "display": "Indoor Cardio",
					    "parent": {
					      "key": "indoor_training",
					      "display": "Indoor Training"
					    }
					  },
					  {
					    "key": "other",
					    "display": "Other",
					    "parent": {
					      "key": "all",
					      "display": "All"
					    }
					  }
					]
				)
			}
		};

		var store = new Ext.data.JsonStore({
			data: activityTypeData,
		    root: 'data.activityTypes',
			id: 'key',
			fields: [
	            {name: 'key'},
	            {name: 'defaultDisplay', mapping: 'display'},
	            {name: 'isDefault'}
	        ]
		});
		return store;
	},
	
	/**
	 * 
	 * @param {Object} Ext.form.ComboBox config
	 * 
	 * @return {Ext.form.ComboBox}
	 */
	getEventTypesCombo: function(config, includeAll, includeUncategorized) {
		var store = this._getEventTypesStore(includeAll, includeUncategorized);
		var combo = new Ext.form.ComboBox(Ext.apply(config,Ext.apply(ActivityFormFieldsConstants.COMBO_BOX_DEFAULT_CONFIG_OPTIONS, {
				name: ActivityFormFieldsConstants.formFieldNames.EVENT_TYPE,
				emptyText: 'Pick an Event Type',
		        store: store,
				mode: 'local',
		        displayField:'defaultDisplay',
				valueField:'key'
			}))
		);
		return combo;
	},

	/**
	 * 
	 * @return {Ext.data.Store}
	 */
	_getEventTypesStore : function(includeAll, includeUncategorized) {
		var eventTypesArray = [];
		if(includeAll) {
			eventTypesArray.push({
				"key":"all",
				"display": "All",
				"isDefault": "true"
			});
		}
		if(includeUncategorized) {
			eventTypesArray.push({
				"key":"uncategorized",
				"display": "Uncategorized"
			});
		}

		var eventTypeData = {"data":
			{"eventTypes":
				eventTypesArray.concat(
					[
						  {
						    "key": "race",
						    "display": "Race"
						  },
						  {
						    "key": "specialEvent",
						    "display": "Special Event"
						  },
						  {
						    "key": "transportation",
						    "display": "Transportation"
						  },
						  {
						    "key": "recreation",
						    "display": "Recreation"
						  },
						  {
						    "key": "geocaching",
						    "display": "Geocaching"
						  },
						  {
						    "key": "training",
						    "display": "Training"
						  },
						  {
						    "key": "touring",
						    "display": "Touring"
						  },
						  {
						    "key": "fitness",
						    "display": "Fitness"
						  }
					]
				)
			}
		};

		var store = new Ext.data.JsonStore({
			data: eventTypeData,
		    root: 'data.eventTypes',
			id: 'key',
			fields: [
	            {name: 'key'},
	            {name: 'defaultDisplay', mapping: 'display'},
	            {name: 'isDefault'}
	        ]
		});
		return store;
	},
	
	/**
	 * 
	 * @param {Object} Ext.form.ComboBox config
	 * 
	 * @return {Ext.form.ComboBox}
	 */
	getTimeZonesCombo: function(config) {
		var store = this._getTimeZonesStore();
		var combo = new Ext.form.ComboBox(Ext.apply(config,Ext.apply(ActivityFormFieldsConstants.COMBO_BOX_DEFAULT_CONFIG_OPTIONS, {
				name: ActivityFormFieldsConstants.formFieldNames.TIME_ZONE,
				emptyText: 'Pick a Time Zone',
		        store: store,
				mode: 'local',
		        displayField:'defaultDisplay',
				valueField:'key'
			}))
		);
		return combo;
	},

	/**
	 * 
	 * @return {Ext.data.Store}
	 */
	_getTimeZonesStore : function(includeAll, includeUncategorized) {
		var timeZoneData = 
{"dictionary": [
  {
    "key": "Pacific/Pago_Pago",
    "display": "Somoa Time",
    "abbr": "ST"
  },
  {
    "key": "Pacific/Honolulu",
    "display": "Hawaii Time",
    "abbr": "HT"
  },
  {
    "key": "America/Adak",
    "display": "Hawaii-Aleutian Time",
    "abbr": "HAT"
  },
  {
    "key": "Pacific/Marquesas",
    "display": "Marquesas Time",
    "abbr": "MART"
  },
  {
    "key": "Pacific/Gambier",
    "display": "Gambier Time",
    "abbr": "GAMT"
  },
  {
    "key": "America/Anchorage",
    "display": "Alaska Time",
    "abbr": "AKT"
  },
  {
    "key": "Pacific/Pitcairn",
    "display": "Pitcairn Island Time",
    "abbr": "PIT"
  },
  {
    "key": "America/Los_Angeles",
    "display": "Pacific Time (US & Canada)",
    "abbr": "PT"
  },
  {
    "key": "America/Phoenix",
    "display": "Arizona Time",
    "abbr": "AZT"
  },
  {
    "key": "America/Denver",
    "display": "Mountain Time",
    "abbr": "MT"
  },
  {
    "key": "Pacific/Easter",
    "display": "Easter Island Time",
    "abbr": "EAST"
  },
  {
    "key": "America/Costa_Rica",
    "display": "Central Time (Central America)",
    "abbr": "CT"
  },
  {
    "key": "America/Chicago",
    "display": "Central Time (US & Canada)",
    "abbr": "CT"
  },
  {
    "key": "America/New_York",
    "display": "Eastern Time (US & Canada)",
    "abbr": "ET"
  },
  {
    "key": "America/Bogota",
    "display": "Colombia Time",
    "abbr": "COT"
  },
  {
    "key": "America/Puerto_Rico",
    "display": "Atlantic Time (Canada & Central America)",
    "abbr": "AT"
  },
  {
    "key": "Atlantic/Bermuda",
    "display": "Atlantic Time (with daylight savings)",
    "abbr": "AT"
  },
  {
    "key": "America/Santiago",
    "display": "Paraguay Time",
    "abbr": "PYT"
  },
  {
    "key": "America/St_Johns",
    "display": "Newfoundland Time",
    "abbr": "NT"
  },
  {
    "key": "America/Argentina/Buenos_Aires",
    "display": "Argentina Time",
    "abbr": "ART"
  },
  {
    "key": "America/Miquelon",
    "display": "Western Greenland Time",
    "abbr": "WGT"
  },
  {
    "key": "America/Sao_Paulo",
    "display": "Brazil Time",
    "abbr": "BT"
  },
  {
    "key": "Atlantic/South_Georgia",
    "display": "Georgia Time",
    "abbr": "GET"
  },
  {
    "key": "Atlantic/Cape_Verde",
    "display": "Cape Verde Time",
    "abbr": "CVT"
  },
  {
    "key": "Atlantic/Azores",
    "display": "Eastern Greenland Time",
    "abbr": "EGT"
  },
  {
    "key": "Europe/London",
    "display": "Western European Time",
    "abbr": "WET"
  },
  {
    "key": "gmt",
    "display": "Greenwich Mean Time",
    "abbr": "gmt"
  },
  {
    "key": "Africa/Algiers",
    "display": "Western Africa Time",
    "abbr": "WAT"
  },
  {
    "key": "Europe/Paris",
    "display": "Central European Time",
    "abbr": "CET"
  },
  {
    "key": "Africa/Windhoek",
    "display": "West Africa Time",
    "abbr": "WAT"
  },
  {
    "key": "Africa/Johannesburg",
    "display": "Central Africa Time",
    "abbr": "CAT"
  },
  {
    "key": "Europe/Istanbul",
    "display": "Eastern European Time",
    "abbr": "EET"
  },
  {
    "key": "Africa/Djibouti",
    "display": "Eastern Africa Time",
    "abbr": "EAT"
  },
  {
    "key": "Europe/Moscow",
    "display": "Moscow Time",
    "abbr": "MSK"
  },
  {
    "key": "Asia/Tehran",
    "display": "Iran Time",
    "abbr": "IT"
  },
  {
    "key": "Asia/Yerevan",
    "display": "Armenia Time",
    "abbr": "AMT"
  },
  {
    "key": "Asia/Dubai",
    "display": "Gulf Time",
    "abbr": "GT"
  },
  {
    "key": "Asia/Kabul",
    "display": "Kabul Time",
    "abbr": "KT"
  },
  {
    "key": "Asia/Aqtobe",
    "display": "Pakistan Time",
    "abbr": "PKT"
  },
  {
    "key": "Asia/Yekaterinburg",
    "display": "Yekaterinburg Time",
    "abbr": "YEKT"
  },
  {
    "key": "Asia/Calcutta",
    "display": "India Time",
    "abbr": "IT"
  },
  {
    "key": "Asia/Katmandu",
    "display": "Nepal Time",
    "abbr": "NPT"
  },
  {
    "key": "Asia/Omsk",
    "display": "West-Siberian Time",
    "abbr": "OMT"
  },
  {
    "key": "Antarctica/Mawson",
    "display": "Mawson Time ",
    "abbr": "MAWT"
  },
  {
    "key": "Asia/Rangoon",
    "display": "Myanmar Time",
    "abbr": "MMT"
  },
  {
    "key": "Asia/Krasnoyarsk",
    "display": "Krasnoyarsk Time",
    "abbr": "KRAT"
  },
  {
    "key": "Asia/Bangkok",
    "display": "Indochina Time",
    "abbr": "ICT"
  },
  {
    "key": "Asia/Hong_Kong",
    "display": "Hong Kong Time",
    "abbr": "HKT"
  },
  {
    "key": "Asia/Irkutsk",
    "display": "Irkutsk Time",
    "abbr": "IRKT"
  },
  {
    "key": "Asia/Tokyo",
    "display": "Japan Standard Time",
    "abbr": "JST"
  },
  {
    "key": "Asia/Yakutsk",
    "display": "Yakutsk Time",
    "abbr": "YAKT"
  },
  {
    "key": "Australia/Adelaide",
    "display": "Central Time (Australia)",
    "abbr": "CT"
  },
  {
    "key": "Australia/Darwin",
    "display": "Darwin Time",
    "abbr": "DT"
  },
  {
    "key": "Asia/Vladivostok",
    "display": "Vladivostok Time",
    "abbr": "VLAT"
  },
  {
    "key": "Australia/Sydney",
    "display": "Eastern Time (Australia)",
    "abbr": "ET"
  },
  {
    "key": "Pacific/Port_Moresby",
    "display": "Papa New Guinea Time",
    "abbr": "PGT"
  },
  {
    "key": "Australia/Lord_Howe",
    "display": "Western Time (Australia)",
    "abbr": "WT"
  },
  {
    "key": "Pacific/Ponape",
    "display": "Ponape Time",
    "abbr": "PONT"
  },
  {
    "key": "Asia/Magadan",
    "display": "Magadan Time",
    "abbr": "MAGT"
  },
  {
    "key": "Pacific/Norfolk",
    "display": "Norfolk Time (Austrailia)",
    "abbr": "NFT"
  },
  {
    "key": "Pacific/Fiji",
    "display": "Fiji Time",
    "abbr": "FJT"
  },
  {
    "key": "Pacific/Auckland",
    "display": "New Zealand Time",
    "abbr": "NZT"
  },
  {
    "key": "Asia/Kamchatka",
    "display": "Petropavlovsk-Kamchatski Time",
    "abbr": "PETT"
  },
  {
    "key": "Pacific/Chatham",
    "display": "Chatham Time ",
    "abbr": "CHAT"
  },
  {
    "key": "Pacific/Enderbury",
    "display": "Tonga Time",
    "abbr": "TOT"
  },
  {
    "key": "Pacific/Kiritimati",
    "display": "Line Islands Time",
    "abbr": "LINT"
  }
]};

		var store = new Ext.data.JsonStore({
			data: timeZoneData,
		    root: 'dictionary',
			id: 'key',
			fields: [
	            {name: 'key'},
	            {name: 'defaultDisplay', mapping: 'display'},
	            {name: 'isDefault'}
	        ]
		});
		return store;
	}
};