/**
 * Javascript Functions and extension for data 
 * Here you can find extension lib which interact directly or indirectly whith prototype.js and prototype.function.js fremework
 * @see Prototype
 * 
 * @requires package Prototype (all classes)
 * @requires package PrototypeFunction (all classes)
 *
 * @author Lino Telera (collected by)
 *
**/

/**
 * Main static class (show infos)
 */
var PrototypeData = {
	sAuthor: 'Lino "Jan" Telera',
  	sVersion: '1.0'
}

PrototypeData.Object = {
	clone: function(oToClone){
		if(typeof(oToClone) != 'object') {
			return oToClone;
		}else if(oToClone == null){
			return oToClone;
		}else if (oToClone.length > 0) { // Is array
			///
			var oNew = new Array();
			
			for(var i = 0; i<  oToClone.length; i++)
				oNew[i] = this.clone(oToClone[i]);
	
			return oNew;
			
		}else{
	
			var oNew = new Object();
	
			var aKey = Object.keys(oToClone)
			for(var i = 0; i<  aKey.length; i++)
				oNew[aKey[i]] = this.clone(oToClone[aKey[i]]);
	
			return oNew;
		}
	},
	
	/**
	 * Updates object with another object 
	 * @param Object to upadte
	 * @param Object to watch
	 */
	update: function(oObj1, oObj2){
		
		oObj= PrototypeData.Object.clone(oObj1);
		oObjCompare= PrototypeData.Object.clone(oObj2);
		
		
		
		var aKey = Object.keys(oObjCompare);
		for(var i = 0; i<  aKey.length; i++){
			if (typeof(oObj[aKey[i]]) == "Object" && typeof(oObjCompare[aKey[i]] == "Object")){
				// Recompare obj
				oObj = this.update(oObj[aKey[i]], oObjCompare[aKey[i]]);
			}else{
				oObj[aKey[i]] = oObjCompare[aKey[i]];
			}	
		}
		
		return oObj;
	},
	
	_update: function(){
		
	}
}


/**
 * Static class for Form data serialization
 * 
 * Example Form data
 * PrototypeData.Form Object :{
 * 		var1:{
			label: 'labelname',
			type:'cbx',
			option:
				[{
					label: 'choose1',
					value: 'choose1'
				},
				{
					label: 'choose2',
					value: 'choose2'
				}],
			value:0,
			action:{
				choose1:{
					choose1var1:{
						label:'labelname',
						type:'text',
						value:''
					}
					
				},
				
				choose2: {
					PhTickerFeed:{
						label:'test',
						type:'text',
						value:''
					}
				}
			}
		},
		var2:{
			label:'Var Integer',
			type:'text',
			value:'test'
		}
 * }
 * 
 */
PrototypeData.Form = {
	
	
	oDataOutput:null,
	
	serialize:function(oData){
		this.oDataOutput = new Object;
		
		
		
		this._parseNormal(oData);
		
		return Prototype.Object.clone(this.oDataOutput);	
	},
	
	_parseNormal: function(oData){
		var aKey = Object.keys(oData);
		
		for (var i= 0; i < aKey.length; i++){
			switch(oData[aKey[i]].type){
				case 'cbx':
					// Executes parse cbx
					this._parseCbx(oData[aKey[i]], aKey[i]);
				break;
				
				default:
					// Append value
					eval ("this.oDataOutput."+aKey[i]+"=oData[aKey[i]].value")
				break;
			}
		}
	},
	
	_parseCbx: function(oData, sName){
		
		var sOption = "";
		
		
		
		for (var i=0;i < oData.option.length; i++){
			if (oData.value == i){
				sOption = oData.option[i].value
				eval ("this.oDataOutput."+sName+"=sOption");
			}
		}
		
		if (sOption != "" && oData.action){
			
			var oDataToParse = eval ("oData.action."+sOption);
			
			this._parseNormal(oDataToParse);
		}
	}
}

// Set alias
Prototype.Object = PrototypeData.Object;
