// JavaScript Document
// class AjxForm
// code by Azer Manafov (azerman[at]hotmail[dot]com)

var THEME             = 'theme';
var THEME_ALBUM       = 'album';
var THEME_SUBSCRIBE   = 'subscribe';


function clsReqStr          ( visihlp,theme )
{
	var m_visi    = (visihlp == 'undefined')?new clsViewHelper():visihlp;
	var m_request = "";
	var m_encode  = false;
	var m_encknd  = true;//false;
	
	this.encknd   = function( hex ) 
	{   if ( hex == undefined ) hex = false;
//	    m_encknd = hex;
	    m_encknd = true;
	}
	this.newrq    = newrq;
	this.append   = append;
	this.appctrl  = appctrl;
	this.setrq    = setrq;
	this.getrq    = getrq;
	this.encode   = function ( enc ) 
	{   if ( (enc == undefined) || (enc != true)) enc = false;
        m_encode = enc;
	}
	
	if ( theme != undefined ) newrq( theme );
	
	function newrq      ( theme ) {   m_request = THEME + "=" + theme; }
	function appctrl    ( )
    {   for ( var i = 0; i < arguments.length; i += 2)
	    {   var obj = (typeof arguments[i+1] == 'string')?m_visi.getElement( arguments[i+1] ):arguments[i+1];
			if ( !obj ) return false;
			if ( obj.type == 'checkbox')
			     obj.value = (obj.checked)?1:0;
			append( arguments[i],obj.value);
	    }
		return m_request;
	}
	function append     ( )
	{   for ( var i = 0; i < arguments.length; i += 2)
		{   if ( arguments[i+1].length == 0  ) continue;
		    var tmp = "&"+arguments[i]+"=";
		    var p1  = m_request.indexOf(tmp);
			var p2  = 0;
			if ( p1 >= 0 )
			{   p2 = m_request.indexOf("&",p1+1);
				if ( p2 < 0 ) p2 = m_request.length;
				m_request = m_request.substring(p1,p2);
			}
			if ( m_encode == true )
			{    if ( m_encknd == false )
				      arguments[i+1] = base64_encode( arguments[i+1] );
			     else arguments[i+1] = ustr2hex( arguments[i+1] );
			}
			m_request += (tmp+arguments[i+1]);
		}
		return m_request;
	}
	function setrq      ( s ) { m_request = s; }
	function getrq      ( ) { return m_request; }
    function ustr2hex   ( str )
    {   var h = new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
        var t = new Array( );
        var d,a1,a2;
 
    	for (var i = 0,j=0; i < str.length; i++, j += 4)
    	{   d  = str.charCodeAt(i);
    	    b1 = d>>>8;
    	    b2 = (d&0x00ff)
    	    a1 = b1>>>4;
    	    a2 = b1&0x0f
    	    a3 = b2>>>4
    	    a4 = b2 &0x0f
    		t[j+0] = h[a1];
    		t[j+1] = h[a2];
    		t[j+2] = h[a3];
    		t[j+3] = h[a4];
    	}
    	var s = t.join('');

        return s;
    }
};

function clsAjxHelper( )
{
	var m_ajx    = new clsAjxRequest  ( );
	var m_ajxBat = new batchAjxRequest( null,"POST" );
	var m_prop   = 
	{
		img_progress  : "images/sys/progress.gif",
		bkg_progress  : "images/sys/x.gif",//bg_transp128_50.gif",
		crq_object    : null,
        engine_url    : visi.getbaseurl()+"engine.php",//visi.getbaseurl("spear")
		wait_complete : true,
		parse_ext     : null,
		chalenge_ext  : null //followChalengeRq
	};
	var m_session =
	{   'action'     : 'submitted',
		'username'   : '',
		'userlevel'  : '',
	    'userid'     : '',
		'chalenge'   : ''
	};
	var m_this = this;
	
	this.applySessionVars = applySessionVars;

	this.getSessionVars   = getSessionVars;
	this.getRequestObject = getRequestObject;
    this.method           = method;
    this.request          = request;
    this.resetall         = resetall;
	this.setProperties    = setProperties;
	this.syncrq           = syncrq;
	this.utilCleanRespond = utilCleanRespond;

	function applySessionVars   ( ) // public
	{   if ( m_prop.crq_object )
		{   for ( var i in m_session )
			{   if ( m_session[i].length )
		             m_prop.crq_object.append ( i,   m_session[i]  );
			}
		}
	}
    
	function getSessionVars     ( ) {  return m_session;} // public
	function getRequestObject   ( theme ) { return (m_prop.crq_object = new clsReqStr( visi, theme)); } // public
    function method             ( sMethod ) { m_ajxBat.setMethod ( sMethod ); } // public
    function request            ( parameters, target,bWaitIcon ) // public
    {   parameters = ( parameters == undefined )?m_prop.crq_object.getrq():parameters;
	    target     = ( target     == undefined )?utilResults :target;
		bWaitIcon  = ( bWaitIcon  == undefined )?m_prop.wait_complete:bWaitIcon;
  	
		m_ajxBat.addRequest( m_prop.engine_url, parameters, target);
	
	    var r  = visi.getmaxdim( );
    	var o1 = $( 'ajxMaskDiv');
		if ( o1 == null ) o1 = utilCreateProgress( );
    	if ( o1 )
    	{   o1.style.left   = r.left   + 'px';
    		o1.style.top    = r.top    + 'px';
    		o1.style.width  = r.width  + 'px';
    		o1.style.height = r.height + 'px';
    		
    		o2 = $( 'ajxMaskImg');
			o2.style.marginLeft = (r.width/2 -16)   + 'px';
			o2.style.marginTop  = (r.height/2-16)   + 'px';
    		if ( bWaitIcon == undefined ) bWaitIcon = true;
			if ( bWaitIcon == true )
    	         visi.setVisible( o1, true);
    	}
    	
		m_ajxBat.completionRoutine( utilEndRequest );
    	m_ajxBat.runRequest( );
    }
    function resetall           ( ) { m_ajxBat.resetAll();} // public
    function setProperties      ( propObj ) // public
	{   for ( var i in propObj )
	          m_prop[i] = propObj[i];
	}
	function syncrq             ( ){ return m_ajx.postSyncAjaxRq( m_prop.engine_url, m_prop.crq_object.getrq()); } // public

	function utilCleanRespond    ( respond )
	{   var p    = respond.indexOf( "<?xml");
		var xm   = '';
		var ex   = '';
		if ( p >= 0 )
		{   xm   = respond.substr( p );
			if ( p > 0 )
				 ex   = respond.substr( 0,p );
		}
		else
		{   ex = respond;
		}
		if ( ex.length )
			 writeDbgMessage( ex );
		return {'xm':xm, 'ex':ex };
	}
    function utilCreateProgress ( )
	{
		var bod    = document.getElementsByTagName("body")[0];
		var maxr   = visi.getmaxdim( );
		var box    = document.createElement('div');	
		var iw     = 32;
		var w      = maxr.width;
		var ih     = 32;
		var h      = maxr.height;
		box.setAttribute( 'id', 'ajxMaskDiv');  
		visi.setStyles( box,{'position':'absolute','width':(w+'px'),'height':(h+'px'),'left':'0px','top':'0px',
						'background-image':'url(' + m_prop.bkg_progress + ')','background-repeat':'repeat',visibility:'hidden'});
		var img   = document.createElement("img");
		visi.setAttributes( img,{ 'src': m_prop.img_progress,'id':'ajxMaskImg','align':'left','border':'0','width':iw,'height':ih});
		visi.setStyles    ( img,{ 'z-index':'101','margin':'0','margin-left':((w-iw)/2 + 'px'),'margin-top':((h-ih)/2 + 'px')});
		box.appendChild   ( img );
		bod.appendChild   ( box );
		return box;
	}
	function utilEndRequest     ( ) {   visi.setVisible('ajxMaskDiv',false); }
	function utilParsereXml     ( respond )
	{   var prop = { err:'', usr:'', uid:'', ulv:'', chl:'',pic:'', dbg:'', elm: new Array()};
	
		var r    = utilCleanRespond( respond );
		if ( r.xm.length  )
		{
			for ( var i in m_session )
				m_session[i] = '';
			m_session.action = 	'submitted';

			r.xm = r.xm.replace(/<br>/gi, "<br/>");
			var xrsp = xmlparse.parseText( r.xm );
			var err  = xrsp.getElementsByTagName( 'err');
			if ( err.length )
			{   //prop.err += err[0].childNodes[0].nodeValue + "<br>";
				var p1 = r.xm.indexOf('<err>');
				var p2 = r.xm.indexOf('</err>');
				prop.err += r.xm.substring( p1+5,p2);
			}
	
			var dbg  = xrsp.getElementsByTagName( 'dbg');
			if ( dbg.length )
			{   prop.dbg += dbg[0].childNodes[0].nodeValue + "<br>";
				alert( prop.dbg );
			}
			var usr  = xrsp.getElementsByTagName( 'usr');//username
			if ( usr.length )
			{   m_session.username = prop.usr = usr[0].childNodes[0].nodeValue;
			}
	
			var uid = xrsp.getElementsByTagName( 'uid');//userid
			if ( uid.length )
				 m_session.userid = prop.uid = uid[0].childNodes[0].nodeValue;
				 
			var ulv = xrsp.getElementsByTagName( 'ulv');//level
			if ( ulv.length )
				 m_session.userlevel = prop.ulv = ulv[0].childNodes[0].nodeValue;
			
			var chl  = xrsp.getElementsByTagName( 'chl');//chalenge code
			if ( chl.length )
				 m_session.chalenge = prop.chl = chl[0].childNodes[0].nodeValue;
			var pic  = xrsp.getElementsByTagName( 'pic');//secure picture
			if ( pic.length )
				 prop.pic = pic[0].childNodes[0].nodeValue;
			if ( m_prop.parse_ext )
			{
				m_prop.parse_ext( prop,respond );
			}
			return prop;
		}
		else
		{   prop.err = "Unexpected return value: \n" + respond;
		}
	}
	function utilResults        ( ajx, respond )
	{   if ( respond ) respond = visi.trim( respond );
		if ( !respond.length ) return;

		var prop       = utilParsereXml( respond );
		if ( m_prop.chalenge_ext != null )
			 m_prop.chalenge_ext( prop );
	}
	
};
var ajxform = new clsAjxHelper( );
ajxform.method("POST");

