
  /**
	* procore.api.js
	* @author  	   Adam Lee - ejectcore.com
	* @copyright   Copyright Eject Core 2010-2011. All rights reserved.
	* @license 	   end-user license agreements (EULAs)
	* @package     Pro Core Manager API
	* @version 	   1.5 RC1
	*
	*/
	
	function modulePath() {	return psModulePath + 'modules/coremanager/'; }
	
	function ucfirst(str) {
	    var firstLetter = str.substr(0, 1);
	    return firstLetter.toUpperCase() + str.substr(1);
	}	
	
	var proCoreApi = (function() {
		
		(function(jAPI) {
			jAPI.fn.typeWatch = function(options){
	
				options = jAPI.extend({
					wait           : 800,
					callback       : function() {},
					listenChange   : false,
					requiredLength : 0
				}, options);
				
				function checkElement(timer, override) {
					var elTxt = jAPI(timer.el).val();
					if((elTxt.length >= options.requiredLength && elTxt.toUpperCase() != timer.text) || (override && elTxt.length >= options.requiredLength)) {
						timer.text = elTxt.toUpperCase();
						timer.cb(elTxt);
					}
				};
				
				function watchElement(element) {

					if(element.type != undefined) {
						if(element.type.toUpperCase() == "TEXT" || element.type.toUpperCase() == "PASSWORD" || element.nodeName.toUpperCase() == "TEXTAREA") {
							
							var timer = {
								timer : null, 
								text  : jAPI(element).val().toUpperCase(),
								cb    : options.callback, 
								el    : element, 
								wait  : options.wait
							};
		
							var startWatch = function(event) {
								var timerWait    = timer.wait;
								var overrideBool = false;
								
								if(event.keyCode == 13 && this.type.toUpperCase() == "TEXT") {
									timerWait    = 1;
									overrideBool = true;
								}
								
								var timerCallbackFx = function() {
									checkElement(timer, overrideBool)
								}
								if(options.listenChange) jAPI(element).listenForChange();
	
								clearTimeout(timer.timer);
								timer.timer = setTimeout(timerCallbackFx, timerWait);					
							};
							jAPI(element).bind('keydown change click', startWatch);
						}
					}
				};
				return this.each(function(index){
					watchElement(this);
				});
			};
		})(jAPI);
		
		(function(jAPI) {
			jAPI.fn.listenForChange = function(options) {
				settings = jAPI.extend({
					interval: 100 // in microseconds
				}, options);
				
				var jquery_object = this;
				var current_focus = null;
				
				jquery_object.filter(":input").add(":input", jquery_object).focus( function() {
					current_focus = this;
				}).blur( function() {
					current_focus = null;
				});
				
				setInterval(function() {
					// allow
					jquery_object.filter(":input").add(":input", jquery_object).each(function() {
					    // set data cache on element to input value if not yet set
					    if (jAPI(this).data('change_listener') == undefined) {
					        jAPI(this).data('change_listener', jAPI(this).val());
					        return;
					    }
					    // return if the value matches the cache
					    if (jAPI(this).data('change_listener') == jAPI(this).val()) {
					        return;
					    }
					    // ignore if element is in focus (since change event will fire on blur)
					    if (this == current_focus) {
					        return;
					    }
					    // if we make it here, manually fire the change event and set the new value
					    jAPI(this).trigger('change');
					    jAPI(this).data('change_listener', jAPI(this).val());
					});
				}, settings.interval);
				return this;
			};
		})(jAPI);
		
		(function(jAPI) {
			jAPI.fn.clickWatch = function(options){
	
				options = $.extend({
					wait           : 800,
					callback       : function() {},
					requiredLength : 0
				}, options);
				
				function checkEvent(cwatch, override) {
					if(override) { 
						cwatch.cb(cwatch);
					}
				};
				
				function watchClickEvent(element) {
					
					var cwatch = {
						timer : null,
						event : null,
						el    : null,
						cb    : options.callback, 
						wait  : options.wait
					};

					var startWatch = function() {
						var timerWait    = cwatch.wait;
						var overrideBool = false;
						
						if(jAPI('input[type=checkbox]:checked', cwatch.el.parent()).size() > 0) {
							setTimeout(function() {
								timerWait    = 1;
								overrideBool = true;
							}, timerWait);
						} else {
							timerWait    = 1;
							overrideBool = true;
						}
						
						var timerCallbackFx = function() {
							checkEvent(cwatch, overrideBool)
						}
						clearTimeout(cwatch.timer);
						cwatch.timer = setTimeout(timerCallbackFx, timerWait);					
					};
					jAPI(element).live('click', function(e) {
						cwatch.el    = $(this);
						cwatch.event = e;
						startWatch();
					});
				};
				watchClickEvent(this);
			};
		})(jAPI);
		
		
		(function(jAPI){
			jAPI.fn.fsForm = function(options){
				
				options = jAPI.extend({
					trigger         : false,
					scrollSelect    : false,
					onMouseover     : true,
					callbackSearch  : function(type) {},
					callbackClear   : function() {}
				}, options);
				
				var SelectAdd = function(element, index){
					
					var $select     = jAPI(element);
					var width       = $select.width();
					var multiple    = $select.hasClass('multiple') ? ' multiple' : '';
					var groupName   = $select.attr('id').toLowerCase().replace(' ', '-');
					var selectRel   = ($select.attr('rel') != '' ? $select.attr('rel') : '');
					var selectText  = '<span class="fsFormSelectText">'+utility.ucwords(jAPI('option', element).eq(0).text())+'</span>';
					var selectOpen  = '<span rel="'+selectRel+'" class="fsFormSelectOpen"></span>';
					
					index = (index) ? index : 0;
					if(groupName == '') groupName = $select.attr('rel').toLowerCase().replace(' ', '-');
					var ulWrap = '<ul id="'+groupName+'" rel="'+$select.attr('rel')+'"></ul>';
					
					//$select.wrap(jAPI('<div class="fsFormWrapper"></div>').css({zIndex: 6-index}));
					//$select.wrap('<div class="fsFormWrapper" style="z-index: '+6-index+';"></div>');
					$select.addClass('fsFormHidden').after('<div class="fsFormSelectWrapper"><div>'+selectText+selectOpen+'</div>'+ulWrap+'<a class="clearAction">[X] CLEAR SELECTION</a></div>');
					
					var $wrapper = jAPI(element).siblings('.fsFormSelectWrapper').css({width: width +'px'});
					jAPI('.fsFormSelectText', $wrapper).width(width - jAPI('.fsFormSelectOpen', $wrapper).width());
					SelectUpdate(element);
					
					jAPI('div', $wrapper).bind((options.onMouseover ? 'mouseenter' : 'click'), function(){
						jAPI('.fsFormSelectWrapper div').removeClass('active'); jAPI(this).addClass('active');
						jAPI('.fsFormSelectWrapper ul').hide(); var $ul = jAPI(this).siblings('ul'); $ul.toggle();
						return false;
					});
					$wrapper.bind('mouseleave', function(){
						jAPI('.fsFormSelectWrapper div').removeClass('active');
						jAPI('.fsFormSelectWrapper ul').hide();
					});
				};
				
				var listItems = function(groupId, $ul) {
					cbObj.group[groupId] = [];
					jAPI('li .checkbox', $ul).each(function() {
						cbObj.group[groupId].push(jAPI(this));
					});
				};
				
				var searchSelect = function() {
					jAPI('.filtersearch .fsFormSelectWrapper .searchAction').unbind('click').bind('click', function() {
						$ul                  = jAPI(this).parents('.fsFormSelectWrapper').find('ul');
						var groupId          = jAPI(this).attr('rel');
						cbObj.behaviour      = 'multiple';
						cbObj.currentGroup   = groupId;
						listItems(groupId, $ul);
						options.callbackSearch(cbObj);
						return false;
					});
				};
				
				var SelectUpdate = function(element){
					
					var checkbox = '';
					var $select  = jAPI(element);
					var multiple = $select.hasClass('multiple');
					var $wrapper = $select.siblings('.fsFormSelectWrapper');
					var $ul      = $wrapper.find('ul').find('li').remove().end();
					
					jAPI('option', $select).each(function(i){		
						name      = jAPI(this).text().toLowerCase();
						groupName = jAPI(this).parent().attr('id').toLowerCase().replace(' ', '-');
						checkbox  = (multiple ? '<input class="checkbox" type="checkbox" value="'+this.value+'" name="'+jAPI(this).attr('name')+'">' : '');
						listId    = jAPI(this).parent().attr('rel')+'_'+this.value;
						relName   = (jAPI(this).parent().attr('rel') != 'range' ? jAPI(this).val() : this.value);
						if(i > 0 && jAPI(this).attr('name') != undefined) $ul.append('<li rel="'+relName+'" name="'+utility.cleanAccents(jAPI(this).attr('name'))+'">'+checkbox+'<a index="'+ i +'">'+this.text+'</a></li>');	
					});
					
					$ul.find('a').click(function(){

						var listItem     = jAPI(this);
						var itemCheckbox = jAPI(this).parent().find('.checkbox');

						if(! multiple) jAPI('a.selected', $wrapper).removeClass('selected');
						
						if(! listItem.hasClass('selected')) {
							if(multiple) itemCheckbox.attr('checked', true);
							listItem.addClass('selected');
						} else {
							if(multiple) itemCheckbox.attr('checked', false);
							listItem.removeClass('selected');
						}
						
						var checkedSize = $ul.find('.selected').length;
						var groupName   = utility.ucwords(jAPI(this).parents('ul').attr('id'));
						if(! multiple) {
							jAPI('span:eq(0)', $wrapper).html(jAPI(this).html());
							cbObj.groupItem = listItem;
							cbObj.behaviour = 'filter';
							options.callbackSearch(cbObj);
						} else {
							jAPI('.fsFormSelectOpen', $wrapper).attr('class', 'searchAction');
							jAPI('.clearAction', $wrapper).fadeIn('fast');

							var groupId          = $ul.attr('rel');
							cbObj.behaviour      = 'multiple';
							cbObj.currentGroup   = groupId;
							listItems(groupId, $ul);
							options.callbackSearch(cbObj);
							//searchSelect();
						}
					});
				};

				var SelectRemove = function(element){
					var zIndex = jAPI(element).siblings('.fsFormSelectWrapper').css('zIndex');
					jAPI(element).css({zIndex: zIndex}).removeClass('fsFormHidden');
					jAPI(element).siblings('.fsFormSelectWrapper').remove();
				};
				
				var clearSelect = function() {
					jAPI('.filtersearch .fsFormSelectWrapper .clearAction').live('click', function() {
						jAPI(this).fadeOut('slow');
						$ul = jAPI(this).prev();
						$ul.find('.checkbox').attr('checked', false);
						$ul.find('.selected').removeClass('selected');
						$select = $ul.parent().parent().find('select');
						jAPI('.searchAction').attr('class', 'fsFormSelectOpen').removeAttr('title');
						jAPI(this).parent().find('.fsFormSelectText').html(utility.ucwords(jAPI('option', $select).eq(0).html()));
						jAPI('li', $ul).eq(0).show();
						cbObj.itemObject = jAPI(this);
						cbObj.behaviour  = 'clear';
						options.callbackClear(cbObj);
					});
				};
/*
				jAPI('.filtersearch .fsFormSelectWrapper ul.multiple li').clickWatch({ wait : 2000, callback : function(cw) {
					if(cw.event.type == 'click') {
						cbObj.initSearch = true;
						cbObj.initUri    = false;
						filtersearch.init(true, cbObj);
						if(jAPI('input[type=checkbox]:checked', cw.el.parent()).size() > 1)
							jAPI(cw.el).parent().hide();
					}
				}});
*/
				
				clearSelect();
				return this.each(function(){
					jAPI('select', this).each(function(index){ 
						if(options.trigger != this.id) {
							SelectAdd(this, index);
						}
					});
				});
			};
			
			jAPI.fsForm = {
				SelectAdd     : function(element, index){ SelectAdd(element, index); },
				SelectUpdate  : function(element){ SelectUpdate(element); },
				SelectRemove  : function(element){ SelectRemove(element); },
				processSelect : function(){ processSelect(); }
			};
			
			var eachSelect    = function() {};
			
			var processSelect = function() {
				
			};
			
			var cbObj = new Object();
				 cbObj.group = {};
		 		 cbObj.initSearch = true;
			
		})(jAPI);
		

		var globalScope      = {};
		var requiredLength   = 2;
		var apiTools = {
			elementEffect : function() {},
			elementStatus : function(element, required, onSuccess) {
				
				fieldLength = (required === true ? requiredLength : 0);

				if(element.attr('type') == 'text' || element.attr('type') == 'password' || element.attr('type') == 'textarea') {
					if(element.val() != '' && element.val().length >= fieldLength && onSuccess == true) {
						element.addClass('success').removeClass('error').prev('span').removeClass('errorIcon required').addClass('successIcon');
						return false;
					} else {
						element.removeClass('success').addClass('error').prev('span').removeClass('successIcon').addClass('errorIcon');
						if(element.val().length == 0) { 
							element.removeClass('error').prev('span').removeClass('errorIcon');
							if(required) { 
								element.prev('span').addClass('required');
								return true;
							} else {
								return false;
							}
						}
						return true;
					}
				} else if(element.attr('type') == 'select-one' || typeof(element[0]) != 'undefined' && element[0].tagName == 'SELECT') {
					if(element.val() > 0 && onSuccess == true) {
						element.addClass('success').removeClass('required').prev('span').addClass('successIcon');
					} else {
						element.removeClass('success').prev('span').removeClass('successIcon');
						if(required == true) element.addClass('required');
					}
				} else {
					if(element.hasClass('radio') || element.hasClass('type_radio')) {
						element.prev().addClass('successIcon');
					}
				}
				return false;
			}
		};
		
		var apiAjaxMethod = {
			initWidgetCB : true,
			allowEvent   : true,
			moduleEvent  : true,
			bindEvent    : function(selector, eventObj, response){

				var data   = eventObj.data;
				var method = eventObj.method;
				
				if(typeof(eventObj) == 'object' && eventObj.plugin == 'typeWatch') {
					
					jAPI(selector).typeWatch({ wait : eventObj.wait, callback : function() {

						$obj = jAPI(this.el);
						
						if(eventObj.hasOwnProperty('override')) {
							this.moduleEvent = (utility.strstr(eventObj.override, 'event') ? false : true);
							this.allowEvent  = (utility.strstr(eventObj.override, 'event') ? true : false);
						} else {
							this.allowEvent  = (this.moduleEvent !== false ? true : false);
						}
						if(eventObj.hasOwnProperty('widget'))
							this.widget = eventObj.widget;
						
						if(this.allowEvent !== false) {
							if(eventObj.hasOwnProperty('bindValue'))
								data = eventObj.bindValue(data, $obj);
							if(eventObj.hasOwnProperty('execute') && eventObj.execute(data, $obj) || ! eventObj.hasOwnProperty('execute')) {
								if(! eventObj.hasOwnProperty('validate') || eventObj.validate($obj) !== false) {
				 		      	apiAjaxMethod.switchMethod(data, $obj, method, response, eventObj, this.widget);
				 		      }
				 		   }
			 		      if(this.moduleEvent !== true)
								this.allowEvent = false;
			 		   }
	 		      }});
				} else {
				
					var executeEventObj = function(obj) {
						
						if(eventObj.hasOwnProperty('override')) {
							this.moduleEvent = (utility.strstr(eventObj.override, 'event') ? false : true);
							this.allowEvent  = (utility.strstr(eventObj.override, 'event') ? true : false);
							this.widget      = eventObj.widget;
						} else {
							this.allowEvent  = (this.moduleEvent !== false ? true : false);
						}
						
						if(this.allowEvent !== false) {
							if(eventObj.hasOwnProperty('bindValue'))
								data = eventObj.bindValue(data, obj);
							if(eventObj.hasOwnProperty('execute') && eventObj.execute(data, obj) || ! eventObj.hasOwnProperty('execute')) {
								if(method != undefined) {
									apiAjaxMethod.switchMethod(data, obj, method, response, eventObj, this.widget);
								}
							}
							if(this.moduleEvent !== true)
								this.allowEvent = false;
						}
					};
					if(eventObj.event !== undefined && eventObj.event.substr(0, 3) == 'key') {
						jAPI(selector).live(eventObj.event, function() {
							executeEventObj(jAPI(this));
						});
					} else {
						var event = eventObj;
						if(eventObj.hasOwnProperty('event'))
							event = eventObj.event;
						if(eventObj.event != 'change') {
							if(eventObj.event != 'clickOnce') {
								if(event != 'submit') {
									if(event != 'live-click') {
										jAPI(selector).bind(event, function() {
											executeEventObj(jAPI(this));
											if(eventObj.type != 'radio' && (event == 'click'))
												return false;
										});
									} else {
										jAPI(selector).live('click', function() {
											executeEventObj(jAPI(this));
											return false;
										});
									}
								} else {
									jAPI(selector).bind('submit', function() {
										executeEventObj(jAPI(this));
										return false;
									});
								}
							} else {
								jAPI(selector).unbind('click').bind('click', function() {
									executeEventObj(jAPI(this));
									return false;
								});
							}
						} else {
							// Live Change Event Not Supported by IE!
							//if(! $.browser.msie) {
								//$(selector).live('change', function() { executeEventObj($(this)); });
							//} else {
								jAPI(selector).change(function() { executeEventObj(jAPI(this)); });
							//}
						}
					}
				}
			},
			switchMethod  : function(data, obj, method, response, eventObj, widget) {
				if(eventObj.hasOwnProperty('widget') && utility.strstr(wResponder, '[WIDGET]')) {
					this.widget    = widget;
					this.responder = wResponder.replace(/\[WIDGET\]/g, this.widget);
					//alert(this.widget + ' widget');
				} else {
					this.responder = responder;
					this.widgetObj = window[widget + 'Widget'];
				}
				
				if(response !== false) {
					this.onBind = true;
					switch(method) {
						case 'getJSON' :
							this.getJSON(data, obj, response);
							break;
						case 'ajax' :
							this.ajax(data, obj, response);
							break;
						case 'get' :
							this.get(data, obj, response);
							break;
						case 'post' :
							this.post(data, obj, response);
							break;
					}
				}
			},
			defaultData  : {},
			data         : {},
			responseData : {},
			widgetObj    : {},
			method       : false,
			onBind       : false,
			widget       : '',
			responder    : '',
			ajaxSetup    : function() {
				jAPI.ajaxSetup({
	 				cache:   false,
	 				async:   true,
	 				timeout: 6000
				});
			},
			getJSON      : function(data, obj, response){
				this.method   = 'getJSON';
				data = jAPI.extend(this.defaultData, data);
				
				if(response !== false) {
					var jsonObj = jAPI.getJSON(responder, data, function(json) {
					}).success(function(json) {
						if(response != null) {
							if(response.hasOwnProperty('onSuccess')) {
								response.onSuccess(json, obj);
								apiAjaxMethod.responseData = json;
							}
						}
					}).complete(function(jqXHR, textStatus) {
						if(response != null) {
							if(response.hasOwnProperty('complete')) {
								response.complete(jqXHR, textStatus);
							}
						}
					});
					jsonObj.complete(function(){ 
						if(response.hasOwnProperty('afterComplete')) {
							response.afterComplete(apiAjaxMethod.responseData);
						}
					});
				}
			},
			ajax         : function(data, obj, response, widget){
				
				this.method = 'ajax';
				
				if(typeof(widget) != 'undefined')
					this.responder = wResponder.replace(/\[WIDGET\]/g, widget);
				
				var settings      = {};
				settings.dataType = 'json';
				settings.data     = data;
				settings.url      = (! utility.empty(this.responder) ? this.responder : responder);
				settings.attempts = 0;
				settings.limit    = 5;
				ajaxCall();
				
				function ajaxCall() {

					var ajaxObj = jAPI.ajax(settings);
				
					if(response !== false) {
						if(response.hasOwnProperty('onSuccess')) {
							ajaxObj.success(function(json, textStatus, jqXHR) {
								if(apiAjaxMethod.initWidgetCB && typeof(apiAjaxMethod.widgetObj) != 'undefined' && apiAjaxMethod.widgetObj.hasOwnProperty('callbackOnSuccess')) {
									apiAjaxMethod.widgetObj.callbackOnSuccess(json, obj);
									apiAjaxMethod.initWidgetCB = false;
								} else {
									response.onSuccess(json, obj);
								}
							}).complete(function(jqXHR, textStatus) {
								if(response.hasOwnProperty('complete')) {
									response.complete(jqXHR, textStatus);
								}
							});
						}
						ajaxObj.error(function(XMLHttpRequest, textStatus, errorThrown) {
							if(textStatus == 'timeout') {
								settings.attempts++;
					        	if(settings.attempts <= settings.limit) {
					            ajaxCall();
					            return;
					         }
	                		alert('[DEBUG] We have tried ' + parseInt(settings.attempts-1) + ' times and ' + settings.data.act + ' request still fails.');
	                		// TODO: Add Redirect for PHP Fall Back Method
	           				return;
	           			} else {
	           				// Add Redirect for PHP Fall Back Method
	           			}	
	        			});
	            }
		      }
			},
			get          : function(data, response){ 
				this.method   = 'get';
				this.dataObj  = jAPI.extend(this.defaultData, data);
				this.response = response;
			},
			post         : function(data, getParams, response){ 
				this.method = 'post';
				data = jAPI.extend(this.defaultData, data);
				jAPI.post(responder + getParams, data , function(data) {
					if(data.success) {
						if(response.hasOwnProperty('onSuccess')) {
							response.onSuccess(data);
						}
					} else {
						if(response.hasOwnProperty('onError')) {
							response.onError(data);
						}
					}
				}, dataType);
			}
		};
		
		var apiSystem = {
			logging   : function(data) {
				return;
			},
			message   : function(data) {
				return;
			},
			response  : function(data) {
				return;
			}, 
			'error'   : '[default error message]',
			'success' : '[default success message]',
			'warning' : '[default warning message]'
		};
		
		var apiUI = {
			interface  : {
				tabs       : function(){
					
				},
				accordion  : function(){
					
				}
			},
			components : {
				dropdown   : function(){
					
				},
				panel      : function(){
					
				},
				scrollable : function(){
					
				},
				overlay    : function(){
					
				},
				tooltip    : function(){
					
				},
				slider     : function(){
					
				}
			}
		};
		
		var pluginExtendObj = {};
		
		return {
			init: function() {
				apiAjaxMethod.ajaxSetup();
				return apiObj = {
					tools      : apiTools,
					system     : apiSystem,
					ajaxMethod : apiAjaxMethod,
					pluginExt  : pluginExtendObj,
					interface  : apiUI.interface,
					components : apiUI.components
				};
			}
		};
		
	})();
	
	var utility = (function() {
		return {
			ucfirst : function(str) {
			   var firstLetter = str.substr(0, 1);
				return firstLetter.toUpperCase() + str.substr(1);
			},
			ucwords : function(str) {
				return (str + '').replace(/^([a-z])|\s+([a-z])/g, function ($1) {
       			return $1.toUpperCase();
    			});
			},
			empty   : function(mixed_var) {
				var key;
			   if(mixed_var === "" || mixed_var === 0 || mixed_var === "0" || mixed_var === null || mixed_var === false || typeof mixed_var === 'undefined') {
			   	return true;
			   }
				if(typeof mixed_var == 'object') {
					for (key in mixed_var) {
				   	return false;
				   }
			   	return true;
			   } 
			   return false;
			},
			strstr : function(haystack, needle, bool) {
				var pos = 0; 
			   haystack += '';
			   pos = haystack.indexOf(needle);    
			   if(pos == -1) {
			   	return false;
			   } else {
			   	if (bool) {
			      	return haystack.substr(0, pos);        
			      } else {
			         return haystack.slice(pos);
			      }
			   }
			},
			is_int : function(value) {
				if((parseFloat(value) == parseInt(value)) && !isNaN(value)){
					return true;
				} else {
					return false;
				}
			},
			cleanAccents : function(string) {
	         var r = string.toLowerCase();
	         r = r.replace(new RegExp("\\s", 'g'),"-");
	         r = r.replace(new RegExp("[àáâãäå]", 'g'),"a");
	         r = r.replace(new RegExp("æ", 'g'),"ae");
	         r = r.replace(new RegExp("ç", 'g'),"c");
	         r = r.replace(new RegExp("[èéêë]", 'g'),"e");
	         r = r.replace(new RegExp("[ìíîï]", 'g'),"i");
	         r = r.replace(new RegExp("ñ", 'g'),"n");                            
	         r = r.replace(new RegExp("[òóôõö]", 'g'),"o");
	         r = r.replace(new RegExp("œ", 'g'),"oe");	
	         r = r.replace(new RegExp("[ùúûü]", 'g'),"u");
	         r = r.replace(new RegExp("[ýÿ]", 'g'),"y");
	         r = r.replace(new RegExp(":", 'g'),"");
	      // r = r.replace(new RegExp("\\W", 'g'),"-");
	         r = r.replace("/", "-");
	         r = r.replace(" ", "-");
	         r = r.replace("--", "-");
	         r = r.replace(/\-$/, "");
	         return r;
			}
		}
	})();
	
	// Initialise the API
	var api          = proCoreApi.init();
	var ajaxResponse = api.ajaxMethod.responseData;
