﻿
/**
  * MSML.load 
  * 
  * @description
  * Microsoft Live Messenger Portal asynchronous loading functionality.
  
  * 
  * @copyright       Neue Digitale / Razorfish 
  * @author          martin.krause@neue-digitale.de
  * @version         1.0
  *
  * @revision        $Revision$
  * @lastmodified    $Date$
  *
  * @jslint			    2009-01-28
  *
  */


MSLM.load = {
	
	__version: 1.0, // class version 
	__class: 'MSLM.load', // class name
	 
	// set default options
	_oDefaults: {
        sClassLoading: 'ajaxLoading',
		sClassError: 'ajaxError'
	},
	

 
	 
	/**
	 * Setup
	 * @param {String} [sTitle], title
	 * @return {Void}
	 */
	_setUp: function (oOptions) {
		var _scope = MSLM.load;
		// merge options and defaults
		_scope._oOpt = jQuery.extend({},_scope._oDefaults, oOptions);
		_scope._oDefaults = null;
	},

	
	/**
	* Add events 
	* @return {Void}
	*/
	_addEvents: function() {

		// add event on selectbox "emoticons"
		jQuery('#order_emoticons')
			.unbind('change.loadEmoticons')
			.bind('change.loadEmoticons', MSLM.load.emoticons)
			.trigger('change.loadEmoticons');
		
		// add event on selectbox "animoticons"
		jQuery('#order_animoticons')
			.unbind('change.loadAnimoticons')
			.bind('change.loadAnimoticons', MSLM.load.animoticons)
			.trigger('change.loadAnimoticons');

		// add event on selectbox "Anzeigebilder"
		jQuery('#order_anzeigebilder')
			.unbind('change.loadAnzeigebilder')
			.bind('change.loadAnzeigebilder', MSLM.load.displaypictures)
			.trigger('change.loadAnzeigebilder');
	
		// add event on selectbox "Hintergünde"
		jQuery('#order_hintergrund')
			.unbind('change.loadHintergruende')
			.bind('change.loadHintergruende', MSLM.load.backgrounds)
			.trigger('change.loadHintergruende');

		// add event on selectbox "Hintergünde"
		jQuery('.order_games')
			.unbind('change.loadGames')
			.bind('change.loadGames', MSLM.load.games)
			.trigger('change.loadGames');
	
		// add event on selectbox "Hintergünde"
		jQuery('form.content_into')
			.unbind('submit.contentInto')
			.bind('submit.contentInto', MSLM.load.contentInto);
	},
	
	/**
	* Load emoticons via XHR
	* @param {Event} event
	* @return {Void}
	*/
	emoticons: function(event) {
    	event.stopPropagation();
		var _sValue = event.target.value;
    	MSLM.load._doRepeaterLoad('#template_emoticons',{ url: MSLM.config.sURLemoticonsJSON , RESTAPI: [ _sValue ]});
    },

	/**
	* Load animoticons via XHR
	* @param {Event} event
	* @return {Void}
	*/
	animoticons: function(event) {
    	event.stopPropagation();
		var _sValue = event.target.value;
    	MSLM.load._doRepeaterLoad('#template_animoticons',{ url: MSLM.config.sURLanimoticonsJSON , RESTAPI: [ _sValue ]});
    },
    
	/**
	* Load Anzeigebilder via XHR
	* @param {Event} event
	* @return {Void}
	*/
	displaypictures: function(event) {
    	event.stopPropagation();
		var _sValue = event.target.value;
    	MSLM.load._doRepeaterLoad('#template_anzeigebilder',{ url: MSLM.config.sURLdisplaypicturesJSON , RESTAPI: [ _sValue ]});
    },
    
	/**
	* Load Hintergünde via XHR
	* @param {Event} event
	* @return {Void}
	*/
	backgrounds: function(event) {
    	event.stopPropagation();
		var _sValue = event.target.value;
    	MSLM.load._doRepeaterLoad('#template_hintergrund',{ url: MSLM.config.sURLbackgroundsJSON , RESTAPI: [ _sValue ]});
    },
    
	/**
	* Load Hintergünde via XHR
	* @param {Event} event
	* @return {Void}
	*/
	games: function(event) {
    	event.stopPropagation();
		var _sValue = event.target.value;
    	MSLM.load._doRepeaterLoad('#template_games',{ url: MSLM.config.sURLgamesJSON , RESTAPI: [ _sValue ]});
    },
    
    
	/**
	* Load emoticons via XHR
	* @param {String} sSelector, jQuery-Selector defining the content wrapper
	* @param {Object} oOptions, Request Options
	* @return {Void}
	*/
    _doRepeaterLoad: function (sSelector,oOptions) {
 		var _scope = MSLM.load;
 		// clear current HTML
		jQuery(sSelector)
			.removeClass(_scope._oOpt.sClassError)
			.addClass(_scope._oOpt.sClassLoading)
			.find('.generated_repeater')
			.remove();
			
		// request json using gimas api
		jQuery.ajax({
			url: oOptions.url+'/'+oOptions.RESTAPI.join('/'),
			dataType: "json",
			success: function() {MSLM.load._onRepeaterLoadSuccess(arguments[0],arguments[1], sSelector);},
			error: function() {MSLM.load._onError(sSelector);}
		});
    },
    
	/**
	* onComplete Callback
	* @param {JSON} JSON
	* @param {String} sStatus, Request-Status as string "success || error"
	* @param {String} sSelector, jQuery-Selector defining the content wrapper
	* @return {Void}
	*/
	_onRepeaterLoadSuccess: function (json,sStatus,sSelector ) {
	     var _$json = jQuery(json);
	     
	     // valid request: status ok and elements present 
	     if (sStatus === 'success' && _$json.size() ){
			// remove loading 
			jQuery(sSelector)
				.removeClass(MSLM.load._oOpt.sClassLoading);
			// create html structure from json if possible
	        MSLM.template.fill(sSelector,'repeater',_$json);
	     } 
	     // invalid request
	     else {
	       MSLM.load._onError(sSelector);
	     }
	     // trigger custom event
	     jQuery(document).trigger('ajaxLoadComplete',{sIdScope:sSelector});
	},
 
	
	/** 
	* default onError callback
	* @param {String}, sSelector, jQuery-selector grabbing the HTML-content-wrapper for this type
	* @return {Void}
	*/
//	_onError: function (sSelector) {
//		_scope = MSLM.load;
//		jQuery(sSelector)
//			.removeClass(_scope._oOpt.sClassLoading)
//			.addClass(_scope._oOpt.sClassError);
//	},
 
	

	/**
	* Load content from a.href or form.action and replacing this element with the corresponding found inside the responseText
	* @param {Event} 
	* @return {Void}
	*/
	contentInto: function(event) {
		// stop event if possible
		if (event.stopPropagation && typeof event.stopPropagation == 'Function') { 
			event.stopPropagation(); 
		}
		// get element
		var _$element = jQuery(event.target) || jQuery(event);
		// geturl 
		var _sUrl = _$element.attr('action') || _$element.attr('href');
		// missing url, id or running request
		if (!_sUrl || !_$element.attr('id') || MSLM.load.contentInto.storedHTMLId || MSLM.load.contentInto.storedHTMLNodes ) {
			//throw new Error("[MSLM.load.content] MISSING ACTION / HREF ||running load");
			return false;
		}

    	MSLM.load._doContentInto(_$element,{ url: _sUrl , data:_$element.serializeArray()});
    	return false;
    },
    
	/**
	* Load content via XHR
	* @param {String} sSelector, jQuery-Selector defining the content wrapper
	* @param {Object} oOptions, Request Options
	* @return {Void}
	*/
    _doContentInto: function ($element,oOptions) {
 		var _scope = MSLM.load;
 		var _sHeight = $element.height()+'px';
 		// clear current HTML, prepare html 
		MSLM.load.contentInto.storedHTMLId = $element.attr('id');
		MSLM.load.contentInto.storedHTMLNodes = $element.clone(true);
		$element
			.css('height',_sHeight)
			.empty()
			.removeClass(_scope._oOpt.sClassError)
			.addClass(_scope._oOpt.sClassLoading);
			
		// request content 
		$element.load(
			oOptions.url+' '+ '#'+$element.attr('id')+' > *', 
			( oOptions.data || [] ), 
			function() { MSLM.load._onContentIntoComplete(arguments[0],arguments[1],arguments[2],$element.attr('id') ) ;
			}
		);
    },
    
	/**
	* onComplete Callback
	* @param {JSON} JSON
	* @param {String} sStatus, Request-Status as string "success || error"
	* @param {String} sSelector, jQuery-Selector defining the content wrapper
	* @return {Void}
	*/
	_onContentIntoComplete: function (html,sStatus,xhr,sSelector ) {
		
		// restore original layer content if layer has been closed during the request 
		if (!MSLM.modal.isOpen()){
			// restore
			MSLM.modal.restoreOriginalContent();
			// trigger custom event
			jQuery(document).trigger('ajaxLoadComplete',{sIdScope:sSelector});
			return false;
		}
	     
	    // status : ok and selector is present  
	    if (sStatus === 'success' && jQuery(xhr).find('#'+sSelector).size() ){
			// remove loading, reset height 
			jQuery('#'+sSelector)
				.removeClass(MSLM.load._oOpt.sClassLoading)
				.height('');
	     } 
	     // fail 
	     else {
	       MSLM.load._onError(sSelector);
	     }
	     // trigger custom event
	     jQuery(document).trigger('ajaxLoadComplete',{sIdScope:sSelector});
	},
 
	
	/** 
	* default onError callback
	* @param {String}, sSelector, jQuery-selector grabbing the HTML-content-wrapper for this type
	* @return {Void}
	*/
	_onError: function (sSelector) {
		var _scope = MSLM.load;
//		var sSelector = (sSelector.indexOf('#') !== -1 ) ? sSelector : '#'+sSelector;
		jQuery('#'+sSelector)
			.removeClass(_scope._oOpt.sClassLoading)
			.addClass(_scope._oOpt.sClassError);
	},

	
	
	 /**
	 * Constructor
	 * @param {Object} [oOptions]
	 * @constructor
	 */
	initialize: function (oOptions) {
		// fake singleton
		if (this._oOpt) {
			return this;
		}
		// setup 
		this._setUp(oOptions);
		this._addEvents();
		// fake singleton
		return this;
	}
};

// initialize onDOMReady
jQuery(function() {
	MSLM.load.initialize();
	

});
