﻿
/**
  * KIM.load 
  * 
  * @description
  * Microsoft Live Messenger Portal asynchronous loading functionality.
  
  * 
  * @copyright       Neue Digitale / Razorfish 
  * @author          martin.krause@neue-digitale.de
  * @version         1.2
  *
  * @revision        $Revision$
  * @lastmodified    $Date$
  *
  * @jslint			    2009-03-03
  *
  */

if (typeof(KIM) == 'undefined') { KIM ={};} 
KIM.load = {
	
	__version: 1.2, // class version 
	__class: 'KIM.load', // class name
	 
	// set default options
	_oDefaults: {
        sClassLoading: 'ajaxLoading',
		sClassError: 'ajaxError'
	},
	
	_storedJSONElements : {},
	

 
	 
	/**
	 * Setup
	 * @param {String} [sTitle], title
	 * @return {Void}
	 */
	_setUp: function (oOptions) {
		var _scope = KIM.load;
		// merge options and defaults
		_scope._oOpt = jQuery.extend({},_scope._oDefaults, oOptions);
		_scope._oDefaults = null;
	},

	
	/**
	* Add events 
	* @return {Void}
	*/
	_addEvents: function() {


		if (jQuery('.jLoadNachrichten').size()) {
			KIM.load.nachrichten();
		}
		
		if (jQuery('.jLoadFilmtipps').size()) {
			KIM.load.filmtipps();
		}
		
		if (jQuery('.jLoadBuchtipps').size()) {
			KIM.load.buchtipps();
		}
		
		if (jQuery('.jLoadSurftipps').size()) {
			KIM.load.surftipps();
		}
	 
	},
	
	/**
	* Load nachrichten via XHR
	* @param {Event} event
	* @return {Void}
	*/
	nachrichten: function(event) {
    	KIM.load._doRepeaterLoad('#template_news',{ url: KIM.config.sURLnachrichtenJSON, iPaginate: 4});
    },
 
  	/**
	* Load filmtipps via XHR
	* @param {Event} event
	* @return {Void}
	*/
	filmtipps: function(event) {
    	KIM.load._doRepeaterLoad('#template_filmtipps',{ url: KIM.config.sURLfilmtippsJSON, iPaginate: 4});
    },  
    
  	/**
	* Load buchtipps via XHR
	* @param {Event} event
	* @return {Void}
	*/
	buchtipps: function(event) {
    	KIM.load._doRepeaterLoad('#template_buchtipps',{ url: KIM.config.sURLbuchtippsJSON, iPaginate: 4});
    },  
    
  	/**
	* Load surftipps via XHR
	* @param {Event} event
	* @return {Void}
	*/
	surftipps: function(event) {
    	KIM.load._doRepeaterLoad('#template_surftipps',{ url: KIM.config.sURLsurftippsJSON, iPaginate: 4});
    },  
    
    
	/**
	* 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 = KIM.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,
			dataType: "json",
			success: function() {KIM.load._onRepeaterLoadSuccess(arguments[0],arguments[1], sSelector, { iPaginationItems: oOptions.iPaginate ||null, iPaginationSite : 1 } );},
			error: function() {KIM.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,oOptions_ ) {
	
	     var _$json = KIM.load._storedJSONElements = jQuery(json);
	     
	     // valid request: status ok and elements present 
	     if (sStatus === 'success' && _$json.size() ){
			// remove loading 
			jQuery(sSelector)
				.removeClass(KIM.load._oOpt.sClassLoading);
			
			// create html structure from json if possible
	        KIM.template.fill(sSelector,'repeater',_$json,oOptions_);
	     } 
	     // invalid request
	     else {
	       KIM.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 = KIM.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') || KIM.load.contentInto.storedHTMLId || KIM.load.contentInto.storedHTMLNodes ) {
			//throw new Error("[KIM.load.content] MISSING ACTION / HREF ||running load");
			return false;
		}

    	KIM.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 = KIM.load;
 		var _sHeight = $element.height()+'px';
 		// clear current HTML, prepare html 
		KIM.load.contentInto.storedHTMLId = $element.attr('id');
		KIM.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() { KIM.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 (!KIM.modal.isOpen()){
			// restore
			KIM.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(KIM.load._oOpt.sClassLoading)
				.height('');
	     } 
	     // fail 
	     else {
	       KIM.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 = KIM.load;
//		var sSelector = (sSelector.indexOf('#') !== -1 ) ? sSelector : '#'+sSelector;
		jQuery('#'+sSelector)
			.removeClass(_scope._oOpt.sClassLoading)
			.addClass(_scope._oOpt.sClassError);
	},

 
	
	/** 
	* Shows paginated page by passing in the index aka the number of the page to display, bridge to _doShowPaginatedPage
	* @param {Event}, event_, event_.data.sAction
	* @return {Bool} false
	*/
	showPaginatedPage: function(event_){
		KIM.load._doShowPaginatedPage(parseInt(event_.data.sAction));
		return false;
	},
	
	
	/** 
	* Actually Shows paginated page by passing in the index aka the number of the page to display
	* @param {Number}, iIndex_
	* @return {Bool} false
	*/
	_doShowPaginatedPage: function (iIndex_) {
		// cache scope
		var _scope = KIM.load;
		// prepare body 
		jQuery('#content .body')
			.removeClass(_scope._oOpt.sClassError)
			.removeClass(_scope._oOpt.sClassLoading)
			.find('.generated_repeater')
			.remove();
		// fill content 
		KIM.template.fill(jQuery('#content .body'),'repeater',KIM.load._storedJSONElements,{ iPaginationItems: 4, iPaginationSite : iIndex_ });
		return false;
	},
	
	
	 /**
	 * 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() {
	KIM.load.initialize();
	

});
