/*
 *
 * Copyright (C) 2009 EmbedOne.
 * Contact: EmbedOne Software Information (info@embedone.com)
 *
 * Commercial Usage
 * Licensees holding valid EmbedOne Commercial licenses may use this file
 * in accordance with the EmbedOne Commercial License Agreement provided
 * with the Software or, alternatively, in accordance with the terms
 * contained in a written agreement between you and EmbedOne.
 *
 * GNU General Public License Usage
 * Alternatively, this file may be used under the terms of the GNU
 * General Public License version 3.0 as published by the Free Software
 * Foundation and appearing in the file LICENSE.GPL included in the
 * packaging of this file.  Please review the following information to
 * ensure the GNU General Public License version 3.0 requirements will be
 * met: http://www.gnu.org/copyleft/gpl.html.
 *
 * If you are unsure which license is appropriate for your use, please
 * contact the EmbedOne sales department at sales@embedone.com.
 *
 */

// This file defines the methods and objects to handle the data operations for config etc.

var objOldKeys = new Object();
var objNewKeys = new Object();
var objRealOldKeys = new Object();

// ======================================
function mOldKeysFromResult( dResult ){
	objOldKeys = new Object();
	for(var vCkl = 0;  vCkl < dResult.data.length; vCkl++ ){
		objOldKeys[dResult.data[vCkl]["key"]] =  dResult.data[vCkl]["value"];
	}
}

function mRealOldKeysFromResult( dResult ){
	objRealOldKeys = new Object();
	for(var vCkl = 0;  vCkl < dResult.data.length; vCkl++ ){
		objRealOldKeys[dResult.data[vCkl]["key"]] =  dResult.data[vCkl]["value"];
	}
}


function mCalcKeys( dData ){
	var vCounter = 0;
	for(var iKey in dData){
		vCounter++;
	}
	return vCounter;
}

// copying the values from the old keys
function mInitNewKeys(){
	objNewKeys = new Object();
	for(var iKey in objOldKeys){
		objNewKeys[iKey] = objOldKeys[iKey];
	}
}

// calculating number of changes
function  mCalcDataChanges(){
	var vChangeCounter = 0;

	for(var iKey in objOldKeys){
		if( objNewKeys[iKey] != objOldKeys[iKey] ){
			vChangeCounter = vChangeCounter + 1;
		}
	}
	
	return vChangeCounter;
}



function mCreateRawText( dData ){
	var vReturnText="";
	for(var iKey in dData){
			vReturnText = vReturnText + iKey + "="+ mEscapeData(dData[iKey])+"\n";
	}	
	return vReturnText;
}

function mCreateHTMLText( dData ){
	var vReturnText="";
	for(var iKey in dData){
			vReturnText = vReturnText + iKey + "="+ mEscapeData(dData[iKey])+"<br>";
	}	
	return vReturnText;
}

function mCreateColoredHTMLText( dData, dColor ){
	var vReturnText="";
	for(var iKey in dData){
			if( dColor[iKey] == "RED" ){
				vReturnText = vReturnText + '<FONT COLOR="'+dColor[iKey]+'"><S>'+iKey + "="+ mEscapeData(dData[iKey])+"</S></FONT><br>";			
			}else{
				vReturnText = vReturnText + '<FONT COLOR="'+dColor[iKey]+'">'+iKey + "="+ mEscapeData(dData[iKey])+"</FONT><br>";
			}
	}	
	return vReturnText;
}



// prepare text for the printing
function mCreateText( dChangesOnly ){
	var vReturnText="";
	for(var iKey in objNewKeys){
		if( !dChangesOnly || ( objNewKeys[iKey] != objOldKeys[iKey] ) ){
			vReturnText = vReturnText + iKey + "="+objNewKeys[iKey]+"\n";
		}
	}	
	return vReturnText;
}


// parsing the entry data
function mParseDataText( dText ){
	var objReturned = new Object();
	var vLines; 
	var vPos = 0;
	var vKey;
	var vValue;
	
	// ugly browser dependent part
	if( navigator.appName == "Microsoft Internet Explorer"){
		vLines = dText.split('\r\n');
	}else{
		vLines = dText.split('\n');
	}
	
	for( var vCkl = 0; vCkl < vLines.length; vCkl = vCkl + 1 ){
	//	alert(vLines[vCkl] );
		if( vLines[vCkl].length < 2){
			// do nothing, we skip empty lines, but not with spacebars
		}else{
			//alert("processing " + vLines[vCkl].length);
			// detecting the first "="
			vPos = vLines[vCkl].indexOf('=');
			vKey = vLines[vCkl].substring(0, vPos );
			vValue = mUnescapeData(vLines[vCkl].substring(vPos + 1, vLines[vCkl].length));
			//alert(vKey + ":" + vValue);
			// alert("key:"+vKey+"||value:"+vValue+"||");
			objReturned[vKey]=vValue;
		}
	}
	return objReturned;
}

// playing with data
function mChangeData( dText ){
	objNewKeys = mParseDataText( dText );
	alert( mSimpleJSONStringify(objNewKeys) );
}

// function to avoid bad input, that we cant parse
function mProtectData(vEvent){
	var vKey;
	if(window.event){
		vKey = vEvent.keyCode;
	}
	else if(vEvent.which){
		vKey = vEvent.which;
	}

	if(vKey == 13){
		return;
	}
	
}

var boolSendAllKeys = false;

// function that will prepare an array of 
// set,del commands from the Old and New objects
function mConvertToAction( dOld, dNew ){
	var aRetVal = new Array();
	var vTmp;
	
	for( var vKeyOld in dOld ){
		// alert(vKeyOld);
		var isFound = false;
		for( var vKeyNew in dNew ){
		// alert(vKeyNew);
			if( vKeyOld == vKeyNew ){
				isFound = true;
				if( boolSendAllKeys || (dOld[vKeyOld] != dNew[vKeyNew] )){
					// if we are here, we need to set the key
					//alert("changing " +  vKeyOld);
					vTmp = new Object();
					vTmp.iKey = vKeyOld;
					vTmp.iData =  dNew[vKeyNew];
					vTmp.iCommand = "set";
					aRetVal[aRetVal.length] = vTmp; 
				}
				break;
			}
		}
		// if we are here and notFound, we havnt found a match!
		// deleting the key
		if( !isFound ){
			//alert("deleting " +  vKeyOld);
			vTmp = new Object();
			vTmp.iKey = vKeyOld;
			vTmp.iData =  "";
			vTmp.iCommand = "del";
			aRetVal[aRetVal.length] = vTmp;
			} 
		
	}
	// preping the new keys
	for( var vKeyNew in dNew ){
		// alert(vKeyOld);
		var isFound = false;
		for( var vKeyOld in dOld ){
		// alert(vKeyNew);
			if( vKeyOld == vKeyNew ){
				isFound = true;
				break;
			}
		}
		// if we are here and notFound, we havnt found a match!
		// set a new key
		if( !isFound ){
			//alert("deleting " +  vKeyOld);
			vTmp = new Object();
			vTmp.iKey = vKeyNew;
			vTmp.iData =  dNew[vKeyNew];
			vTmp.iCommand = "set";
			aRetVal[aRetVal.length] = vTmp;
			} 
		
	}
	
	//alert( aRetVal.length);
	return aRetVal;
} 

function mConvertToActionNoDelete( dOld, dNew ){
	var aRetVal = new Array();
	var vTmp;
	
	for( var vKeyOld in dOld ){
		// alert(vKeyOld);
		var isFound = false;
		for( var vKeyNew in dNew ){
		// alert(vKeyNew);
			if( vKeyOld == vKeyNew ){
				isFound = true;
				if( boolSendAllKeys || (dOld[vKeyOld] != dNew[vKeyNew] )){
					// if we are here, we need to set the key
					//alert("changing " +  vKeyOld);
					vTmp = new Object();
					vTmp.iKey = vKeyOld;
					vTmp.iData =  dNew[vKeyNew];
					vTmp.iCommand = "set";
					aRetVal[aRetVal.length] = vTmp; 
				}
				break;
			}
		}
		
	}
	// preping the new keys
	for( var vKeyNew in dNew ){
		// alert(vKeyOld);
		var isFound = false;
		for( var vKeyOld in dOld ){
		// alert(vKeyNew);
			if( vKeyOld == vKeyNew ){
				isFound = true;
				break;
			}
		}
		// if we are here and notFound, we havnt found a match!
		// set a new key
		if( !isFound ){
			//alert("deleting " +  vKeyOld);
			vTmp = new Object();
			vTmp.iKey = vKeyNew;
			vTmp.iData =  dNew[vKeyNew];
			vTmp.iCommand = "set";
			aRetVal[aRetVal.length] = vTmp;
			} 
		
	}
	
	//alert( aRetVal.length);
	return aRetVal;
} 

var objColCode;
function mComposeReviewObject(){
	var objRet = new Object();
	objColCode = new Object();
/*	
	for(var iKey in objNewKeys){
		if( objNewKeys[iKey] != objOldKeys[iKey] ){
				if( objNewKeys[iKey] == null ){
						//objRet[iKey] = objOldKeys[iKey];				
				}else{
					if( objOldKeys[iKey] != undefined ){
						objRet[iKey] = objOldKeys[iKey];
						objColCode[iKey]="GREEN";
					}else{
						objColCode[iKey]="BLACK";
						objRet[iKey] =objNewKeys[iKey];
					}
				}
		}
	}
	for(var iKey in objOldKeys){
		if( objNewKeys[iKey] == null ){
				objRet[iKey] = objOldKeys[iKey];				
						objColCode[iKey]="RED";
		}
	}*/
	for(var iKey in objOldKeys){
		if( typeof(objNewKeys[iKey]) == 'undefined' ){
				// object was deleted
				objRet[iKey] = objOldKeys[iKey];
				objColCode[iKey]="RED";
		}else if(objOldKeys[iKey] == null ){
				// object was created
				objRet[iKey] = objNewKeys[iKey];
				objColCode[iKey]="GREEN";
		}else{
				// object was modified
				objRet[iKey] = objNewKeys[iKey];
				objColCode[iKey]="BLUE";
		}
	}
	
	/*for(var iKey in objNewKeys){
		// the rest wasnt modified
		
		if( typeof(objOldKeys[iKey]) == 'undefined' ){
				objRet[iKey] = objNewKeys[iKey];
				objColCode[iKey]="BLACK";		
		}
	}*/
	return objRet;
}

/*
function mComposeAntiReviewObject(){
	var objRet = new Object();
	
	for(var iKey in objRealOldKeys){
		objRet[iKey] = objRealOldKeys[iKey];
	}

	return objRet;
}
*/
function mEscapeData(daData){
		var retData ="";
		//alert(daData);
		if( daData != null && daData.length > 0){

			for(var vCkl=0; vCkl<daData.length; vCkl ++ ){
				switch(daData[vCkl]){
					case "'":
					case '"':
					case '{':
					case '}':
					case ',':
					case '\\':
						if(! ( daData[0] == '"' && daData[daData.length - 1] == '"' && (vCkl == 0|| vCkl == ( daData.length - 1) ) && daData[vCkl] == '"')){
							retData = retData + '\\' + daData[vCkl];
						}else{
							retData = retData + daData[vCkl];						
						}
					break;
					default:
						retData = retData + daData[vCkl];					
					break;
				}
			}
			if(! ( retData[0] == '"' && retData[retData.length - 1] == '"'  )){
				retData = '"' + retData +'"';
			} 
		}else{
			retData = '""';
		}
		
		return retData;
}


function mUnescapeData(daData){
		//alert("Unescape " + daData);
		
		var retData ="";
		var vaCklStart = 0;
		var vaCklEnd = daData.length;
		
		if(daData == '""'){
			return retData;
		}
		
		if( daData != null && daData.length > 0){
			if( daData[0] == '"' && daData[daData.length - 1] == '"'  ){
					vaCklStart ++;
					vaCklEnd --;
			}
			
			for(var vCkl=vaCklStart; vCkl<vaCklEnd - 1; vCkl ++ ){
				//alert( daData[vCkl] );
				if( daData[vCkl] == '\\' ){
					switch(daData[vCkl + 1]){
						case "'":
						case '"':
						case '{':
						case '}':
						case ',':
						case '\\':
							// skip the character
							retData = retData + daData[vCkl + 1];
							vCkl++;
						break;
					default:
						retData = retData + daData[vCkl];					
					break;
					}	
				}else{
					retData = retData + daData[vCkl];
				}		
			}
			retData = retData + daData[vCkl];
		}else{
			retData = "";
		}
		
		return retData;
}

function mTestData(){
	mInitNewKeys();
	alert( mSimpleJSONStringify(objNewKeys) );
	objNewKeys["key2"] = "";
	objNewKeys["key1"] = "av1";
	
	document.getElementById("ta").value = mCreateText(false);
}

