/**
 * Request.implement
 * 
 * Requestfunktionen
 * Connectbereich für den Verzeichnisaufruf
 * 
 * @version		1.0
 * 
 * @author		GO4WEB Internet Agentur
 * @copyright		2010 Author
 *
 *
 * options:

	this.options.verzUser = 'dbname';
	this.options._verzTreeLayout = [{
 		layout: '<div id="sub{$i}">{$menuname}</div>'
 		,query: '{
 			
 		}'
 	}];
 	this.options._verzMainLayout = [{
 		layout: '<div>{$test}<br />{$test}<br />{$test}<br /></div>'
 		,query: '{
 			
 		}'
 	}];
 */

/**
* GO4WEBDESK - CLASS
* - Verzeichnisfunctions
*	- Requests / Mulirequest
*	- Autorubrikbuilder
*	- Requestsorter
* - DOM Prerenderer
*/
var addDeskJS = new Class({
	
	// implements
	Implements: [Options, Events]
	
	// options
	,options: {
		id: 0
		,debug: 0
		,verzUser: '4c_testuser'
	}
	
	// initialize
	,initialize: function(options){
		this.setOptions(options);
	}
	
	// Dummy-Request auf gewälten user
	,_verzReqData: function(){
		
		this._verzReqStr = {
			type: 'all'
			,user: this.options.verzUser
			,table: {
				listingdatas: 'ld'
				,listingrows: 'lr'
				//,listings: 'l'
			}
			,condition: {
				'lr.language': 'de'
//				OR abfrage
//				0: {
//					'm.sommer': '1',
//					'm.winter':'1'
//				}
			}
			,fields: 'lr.*,ld.*'
			,order: 'ld.id DESC'
			,language: 'de'
		}
	}
	
	// Verzeichnisrequest mit Verweiss auf Folgefunktion
	,_verzReq: function(onCompletFunc){
		
		if(this.options._verzDebug == 1) debugStr = '&debug=1';
		else debugStr = '';
		
		if(!this._verzReqStr) this._verzReqData();
		
		// tempsStr
		if($defined(this._verzTempReqStr) && this._verzTempReqStr){
			reqStr = this._verzTempReqStr;
			this._verzTempReqStr = false;
		}else{
			reqStr = this._verzReqStr;
		}
		
		// Falls Arrayreq nur mit einem Element
		if(reqStr.length == 1) reqStr = reqStr[0];
		
		new Request({
			url: 'index.php'
			,method: 'post'
			,data: 'mode=verzeichnis&local=' + this.options._verzLocal + debugStr +'&request=' + encodeURIComponent(JSON.encode(reqStr))
			,noCache: true
			,onComplete: function(response){
				var req = JSON.decode(response);
				this[onCompletFunc](req);
			}.bind(this)
		}).send();
	}
	
	/**
	 * _verzFormMulti	Merg des MultiformRequest mit tableName adding
	 * 
	 * sortPath		SortPath Falls das Object nach dem Merg sortiert werden soll (siehe _verzFormSort)
	 * order		Order des Sorting
	 */
	,_verzFormMulti: function(req, sortPath, order){
		
		var newReqArr = [];
		var reqOut = [];
		var count = 0;
		
		req.result.each(function(items, key){
			items.each(function(subitems, subkey){
				if($defined(subitems.lr)) subitems.lr['tableName'] = this.options._verzTables[key];
				if($defined(subitems.ld)) subitems.ld['tableName'] = this.options._verzTables[key];
				newReqArr.push($H(subitems));
			}, this);
			count++;
		}, this);
		
		 if(sortPath) newReqArr = this._verzFormSort(newReqArr, sortPath, order);
		
		reqOut['count'] = newReqArr.length;
		reqOut['result'] = newReqArr;
		
		//console.log(reqOut);
		
		return reqOut;
	}
	
	/**
	 * _verzFormSort	Umsortierung eines Hash (Achtung Object muss zu Hash formatiert werden)
	 * 
	 * array		Zu sortierenden Hash
	 * path			Sortierpfad (ld.datum)
	 * order		desc / asc
	 */
	,_verzFormSort: function(array, path, order){
		
		for (var i = 0; i < array.length; i++) {
			
			var currVal = array[i].getFromPath(path);
			var currElem = array[i];
			
			var j = i - 1;
			while ((j >= 0) && (array[j].getFromPath(path) > currVal)) {
				array[j + 1] = array[j];
				j--;
			}
			array[j + 1] = currElem;
		}
		
		if(order == 'desc') array.reverse();
		
		return array;
	}
	
	/**
	 * _verzTreeBuild	Requestobjekt der Rubrik
	 * 
	 * getfrom		"all" oder id <- ab einer id abwärts
	 * level		num / Anzahl nach getfrom == 0
	 */
	,_verzTreeReq: function(getfrom, level){
		
		// db->Request
		this._verTreeBuild();
	}
	
	/**
	 * _verTreeBuild	Requestobjekt der Rubrik
	 * 
	 * getfrom		"all" oder id <- ab einer id abwärts
	 * level		num / Anzahl nach getfrom == 0
	 */
	,_verzTreeBuild: function(){
		
		// ->Request
	}
	
	/**
	 * 
	 */
	,_verzMainBuild: function(){
		
		
	}
});

/**
* DOM - Prerenderer
*  http://mootools.net/forge/p/string_todom
*/
String.implement({
	
	toDOM: function(){
		var wrapper =	this.test('^<the|^<tf|^<tb|^<colg|^<ca') && ['<table>', '</table>', 1] ||
				this.test('^<col') && ['<table><colgroup>', '</colgroup><tbody></tbody></table>',2] ||
				this.test('^<tr') && ['<table><tbody>', '</tbody></table>', 2] ||
				this.test('^<th|^<td') && ['<table><tbody><tr>', '</tr></tbody></table>', 3] ||
				this.test('^<li') && ['<ul>', '</ul>', 1] ||
				this.test('^<dt|^<dd') && ['<dl>', '</dl>', 1] ||
				this.test('^<le') && ['<fieldset>', '</fieldset>', 1] ||
				this.test('^<opt') && ['<select multiple="multiple">', '</select>', 1] ||
				['', '', 0];
		var el = new Element('div', {
			html: wrapper[0] + this + wrapper[1]
		}).getChildren();
		while(wrapper[2]--){
			el = el[0].getChildren();
		}
		return el;
	}
	/*
	,setDOM: function(){
		
	}
	*/
});
