/*
Copyright (c) 2008, Security2day
AJAX-запрос к серверу. 
Шифрование необходимых параметров.
Индикация процесса передачи для пользователя.
*/

if ( typeof YAHOO.security2day == "undefined" ) {
	YAHOO.namespace ("security2day");
}

if ( typeof YAHOO.security2day.ServerRequest == "undefined" ) {
	YAHOO.security2day.ServerRequest = function() {};
	
	YAHOO.security2day.ServerRequest.prototype.url = "";
	YAHOO.security2day.ServerRequest.prototype.aid = "";
	YAHOO.security2day.ServerRequest.prototype.password = "";	
	YAHOO.security2day.ServerRequest.prototype.crypt = "undefined";
	YAHOO.security2day.ServerRequest.prototype.cryptFields = [];
	
	YAHOO.security2day.ServerRequest.prototype.initServerRequest = function( url, crypt, crypt_fields, showloading_callback, hideloading_callback ) {
		this.url = url;		
		this.crypt = crypt;
		this.cryptFields = crypt_fields;		
		// При старте передачи показывается "Загрузка"
		YAHOO.util.Connect.startEvent.subscribe( showLoading );
		// По окончании передачи "Загрузка" исчезает
		YAHOO.util.Connect.completeEvent.subscribe( hideLoading );	
		
		if (YAHOO.security2day.debugging) {
			YAHOO.log("initialized: url="+url, "info", "YAHOO.security2day.ServerRequest");
		}
	}	
	
	YAHOO.security2day.ServerRequest.prototype.setAidPassword = function( aid, password ) {
		this.aid 		= aid;
		this.password 	= password;		
		if (YAHOO.security2day.debugging) {			
			YAHOO.log("Установлен aid="+aid+", password="+password, "info", "YAHOO.security2day.ServerRequest");	
		}
	}
	
	YAHOO.security2day.ServerRequest.prototype.setURL = function( url ) {
		this.url = url;		
	}
	
	YAHOO.security2day.ServerRequest.prototype.send = function( post, success_callback, failure_callback) {
	
		if (YAHOO.security2day.debugging) {
			if ( this.url == "") {
				YAHOO.log("URL не установлен в send()", "error", "YAHOO.security2day.ServerRequest");	
			}
			if ( post == "" ) {
				YAHOO.log("post не установлен в send()", "info", "YAHOO.security2day.ServerRequest");
			}
			if ( this.crypt == "undefined" ) {
				YAHOO.log("crypt не установлен в send()", "error", "YAHOO.security2day.ServerRequest");
			}		
			if ( this.aid == "" || this.password == "" ) {
				YAHOO.log("Не установлен aid или password", "warn", "YAHOO.security2day.ServerRequest");	
			}
		}
		
		if (YAHOO.security2day.debugging) {
			YAHOO.log("Отправка запроса: "+post, "info", "YAHOO.security2day.ServerRequest");
		}
		post = this.encodePost(post) + 'aid=' + this.aid + '&password=' + this.password + '&rnd=' + Math.random();
	
		var callbackObject = 
		{
  			success: success_callback,
		  	failure: failure_callback
		  	//argument: { foo:"foo", bar:"bar" }
		};

		YAHOO.util.Connect.asyncRequest('POST', this.url, callbackObject, post);  
		if (YAHOO.security2day.debugging) {
			YAHOO.log("Отправлен запрос: "+post, "info", "YAHOO.security2day.ServerRequest");
		}
	}
	
	YAHOO.security2day.ServerRequest.prototype.encodePost = function( post ) {	
	
		if (YAHOO.security2day.debugging) {
			if ( this.cryptFields.length == 0  ) {
				YAHOO.log("cryptFields не установлен в encodePost()", "warn", "YAHOO.security2day.ServerRequest");
			}
			if ( post == "" || post == "undefined" ) {
				YAHOO.log("post не установлен в encodePost()", "warn", "YAHOO.security2day.ServerRequest");
			}
		}		
		if ( post == "" || typeof post == "undefined" ) return;
		
		var resultPost = "";
		var arrayOfPost = [];
		var arrayOfParams = [];
		
		arrayOfPost = post.split('&');
		if (YAHOO.security2day.debugging) {
			if ( arrayOfPost.length == 0  ) {
				YAHOO.log("Неверный POST-запрос: "+post, "error", "YAHOO.security2day.ServerRequest");
			}
		}
		for( i=0; i<arrayOfPost.length; i++ ) {
			arrayOfParams[i] = arrayOfPost[i].split('=');
			if (YAHOO.security2day.debugging) {
				if ( arrayOfParams[i].length==0 || typeof arrayOfParams[i][0]=="undefined" || typeof arrayOfParams[i][1]=="undefined") {
					YAHOO.log("Неверный POST-запрос: "+post, "error", "YAHOO.security2day.ServerRequest");
				}
			}
			for( f=0; f<this.cryptFields.length; f++ ) {
				if ( arrayOfParams[i][0] == this.cryptFields[f] ) {
					arrayOfParams[i][1] = crypt.encrypt( arrayOfParams[i][1] );
					break;
				}
			}
			resultPost += arrayOfParams[i][0] + '=' + arrayOfParams[i][1] + '&';
		}		
		return resultPost;
	}
	
	YAHOO.security2day.ServerRequest.prototype.getPass = function( ) {
		return this.password;
	}
		
}

