// ---------------------------------------------------------
// 
// XWeb Client Script Library
// 
// ---------------------------------------------------------

var XWeb = new Object();








// ------------------------------------------------------------------------------------
// XWeb.Utils -------------------------------------------------------------------------
// ------------------------------------------------------------------------------------

XWeb.Utils = new Object();

XWeb.Utils.ArrayIndexOf = function( array, value )
{
//    var e = Function._validateParams(arguments, [
//        {name: "array", type: Array},
//        {name: "value", type: String}
//    ]);
//    if (e) throw e;

    for ( var n = 0; n < array.length; n++ )
        if ( array[n] == value )
            return n;
            
    return -1;
}

XWeb.Utils.ArrayRemoveValue = function( array, value )
{
    var index = XWeb.Utils.ArrayIndexOf( array, value );
    
    if ( index >= 0 )
        array.splice( index, 1 );
}

// Description: Creates a simple clone of an object
// Usage: var clone = XWeb.Utils.Clone( src );
// Remarks: Use with caution. The cloned objects are not always identical to their sources.
XWeb.Utils.Clone = function( myObj )
{
	if ( typeof(myObj) != 'object')
	    return myObj;
	
	if ( myObj == null )
	    return myObj;

	var myNewObj = new Object();

	for ( var i in myObj )
		myNewObj[i] = XWeb.Utils.Clone( myObj[i] );

	return myNewObj;
}














// ------------------------------------------------------------------------------------
// XWeb.UI ----------------------------------------------------------------------------
// ------------------------------------------------------------------------------------

XWeb.UI = new Object();

XWeb.UI.GetControl = function( id )
{
    var e = Function._validateParams(arguments, [
        {name: "id", type: String}
    ]);
    if (e) throw e;

    return new Sys.UI.Control( $get( id ) );
}

XWeb.UI.GetCursorX = function( evt )
{
    if ( evt.pageX )
        return evt.pageX;
    else if ( evt.clientX )
        return evt.clientX + ( document.documentElement.scrollLeft ?
        document.documentElement.scrollLeft :
        document.body.scrollLeft );
    else
        return null;
}

XWeb.UI.GetCursorY = function ( evt ) {
    if ( evt.pageY )
        return evt.pageY;
    else if ( evt.clientY )
        return evt.clientY + ( document.documentElement.scrollTop ?
        document.documentElement.scrollTop :
        document.body.scrollTop );
    else
        return null;
}

XWeb.UI.GetViewportWidth = function()
{    
    return self.innerWidth || (document.documentElement.clientWidth || document.body.clientWidth);  
}

XWeb.UI.GetViewportHeight = function()
{    
    return self.innerHeight || (document.documentElement.clientHeight || document.body.clientHeight);
}

XWeb.UI.GetScrollX = function()
{
    return document.documentElement.scrollLeft;
}

XWeb.UI.GetScrollY = function()
{
    return document.documentElement.scrollTop;
}

XWeb.UI.GetDocumentHeight = function()
{
    if ( document.height )
        return document.height;
    else
        return document.body.offsetHeight;
}

XWeb.UI.GetDocumentWidth = function()
{
    if ( document.width )
        return document.width;
    else
        return document.body.offsetWidth;
}

XWeb.UI.InsertAtCursor = function( obj, text )
{
    obj.focus();
        
    if (document.selection)
    {   
        var range = document.selection.createRange();
        range.text = text;
        range.select();
    }
    else if(obj.selectionStart)
    {   
        var start = obj.selectionStart;   
        var end   = obj.selectionEnd;   
        var pos   = (obj.value.substr(0, start) + text).length;
  
        obj.value = obj.value.substr(0, start) + text + obj.value.substr(end, obj.value.length);  
        obj.setSelectionRange(pos, pos); 
    }
    else
    {   
        // Fallback for any other browser   
    }  
}

XWeb.UI.GetSelectionText = function( obj )
{
    if (document.selection)
    {   
        var range = document.selection.createRange();
        return range.text;
    }
    else if(obj.selectionStart)
    {   
        var start = obj.selectionStart;   
        var end   = obj.selectionEnd;   
        var result = obj.value.substr( start, end - start );
        
        return result;
    }
    else
    {   
        // Fallback for any other browser
        return "";
    }  
}












// ------------------------------------------------------------------------------------
// XWeb.UI.Popup ----------------------------------------------------------------------
// ------------------------------------------------------------------------------------

XWeb.UI.Popup = function( contentElement )
{
    _divContent = contentElement;
    _divBackground = $get('XWeb.Js.PopUpBackground');
    _divHolder = $get('XWeb.Js.PopUpHolder');
    
    var Show = this.Show = function()
    {
        if ( XWeb.UI.Popup.IsActive )
            throw "There is already an active popup";
            
        _divContent.parentNode.removeChild(_divContent);
        _divHolder.appendChild(_divContent);
        
        _divBackground.style.height = XWeb.UI.GetDocumentHeight() + "px";
        _divHolder.style.height = XWeb.UI.GetDocumentHeight() + "px";
        _divBackground.style.display = "block";
        _divHolder.style.display = "block";
        _divContent.style.display = "block";

        UpdatePosition();

        XWeb.UI.Popup.IsActive = true;
    }
    
    var UpdatePosition = this.UpdatePosition = function()
    {
        // screen center
        _divContent.style.left = (_divHolder.offsetWidth / 2 - _divContent.offsetWidth / 2) + "px";
        _divContent.style.top = (XWeb.UI.GetScrollY() + XWeb.UI.GetViewportHeight() / 2 - _divContent.offsetHeight / 2) + "px";
    }
    
    var Close = this.Close = function()
    {
        _divContent.style.display = "none";
        _divHolder.style.display = "none";
        _divBackground.style.display = "none";

        XWeb.UI.Popup.IsActive = false;
    }
}

XWeb.UI.Popup.IsActive = false;






// ------------------------------------------------------------------------------------
// XWeb.UI.LoadingControl -------------------------------------------------------------
// ------------------------------------------------------------------------------------

XWeb.UI.LoadingControl = function( hostElement )
{
    var _hostElement;
    
    if ( typeof(hostElement) == "object" )
        _hostElement = hostElement;
    else
        _hostElement = $get( hostElement );
        
    _tplLoading = XWeb.UI.Templates.GetTemplateByID("XWeb.Js.LoadingControl");
    
    var Start = this.Start = function()
    {
        _hostElement.innerHTML = _tplLoading;
        
        UpdatePosition();
    }
    
    var UpdatePosition = this.UpdatePosition = function()
    {
        var loadingControl = _hostElement.getElementsByTagName("div")[0];
        
        loadingControl.style.position = "absolute";
        loadingControl.style.left = (_hostElement.offsetWidth / 2 - loadingControl.offsetWidth / 2) + "px";
        loadingControl.style.top = (_hostElement.offsetHeight / 2 - loadingControl.offsetHeight / 2) + "px";

    }
    
    var Stop = this.Stop = function()
    {
        _hostElement.innerHTML = "";
    }
}









// ------------------------------------------------------------------------------------
// XWeb.UI.Animator -------------------------------------------------------------------
// ------------------------------------------------------------------------------------

XWeb.UI.Animator = function()
{
    this.speed = 0; // fps
    this.length = 2000 // msec
    this.delay = 0; // msec
    
    this.timeElapsed = 0 // msec
    this.isRunning = false;
    this.framesTicked = 0;
    
    this.onStart = null; // animation start callback
    this.onEnd = null; // animation end callback
    this.onFrameTick = null; // frame tick callback
    
    this.prototype.start = function()
    {
        if ( this.speed > 0 )
            this.delay = 1000 / this.speed;
        
        if ( this.delay > 0 )
        {
            this.timeElapsed = 0;
            this.framesTicked = 0;
            this.isRunning = true;
            
            if ( this.onStart )
                this.onStart();
            
            doFrame();
        }
    }
    
    this.prototype.stop = function()
    {
        this.isRunning = false;
    }
    
    this.prototype.doFrame = function()
    {
        if ( !this.isRunnint )
            return;
            
        if ( this.onFrameTick )
            this.onFrameTick();

        this.timeElapsed += this.delay;
        this.framesTicked++;
        
        if ( this.timeElapsed < this.length )
        {
            var timeDiff = this.length - this.timeElapsed;
            
            if ( timeDiff > this.delay )
                setTimeout( this.doFrame(), this.delay );
            else
                setTimeout( this.doFrame(), timeDiff );
        }
        else
        {
            this.stop();
        }
    }
}










// ------------------------------------------------------------------------------------
// XWeb.UI.Forms ----------------------------------------------------------------------
// ------------------------------------------------------------------------------------

XWeb.UI.Forms = new Object();

XWeb.UI.Forms.SelectByValue = function( subjectID, value )
{
    var e = Function._validateParams(arguments, [
        {name: "subject", type: String},
        {name: "value", type: Number}
    ]);
    if (e) throw e;
    
    var subject = $get( subjectID );

    if ( !subject || subject.selectedIndex == null || value < 0 || value >= subject.length )
        return;
    
    subject.selectedIndex = value;
}












// ------------------------------------------------------------------------------------
// XWeb.UI.Templates ------------------------------------------------------------------
// ------------------------------------------------------------------------------------

XWeb.UI.Templates = new Object();

XWeb.UI.Templates.ParseString = function( template )
{
    if ( !template )
        return "";
        
    if ( arguments.length < 2 )
        return template;
        
    return XWeb.UI.Templates.ParseFinal( template, arguments );
}


XWeb.UI.Templates.ParseElement = function( templateElement )
{
    var template = XWeb.UI.Templates.GetTemplate( templateElement );
    
    if ( !template )
        return "";
        
    if ( arguments.length < 2 )
        return templateEleme;
        
    return XWeb.UI.Templates.ParseFinal( template, arguments );
}

XWeb.UI.Templates.ParseElementByID = function( templateElementID )
{
    var template = XWeb.UI.Templates.GetTemplate( $get( templateElementID ) );
    
    if ( !template )
        return "";
        
    if ( arguments.length < 2 )
        return template;
        
    return XWeb.UI.Templates.ParseFinal( template, arguments );
}


XWeb.UI.Templates.GetTemplate = function( templateElement )
{
    var result;
    
    for ( var n = 0; n < templateElement.childNodes.length; n++ )
    {
        var node = templateElement.childNodes[n];
        
        if ( node.nodeType == 8 )
        {
            result = node.nodeValue
            break;
        }
    }
    
    return result;
}

XWeb.UI.Templates.GetTemplateByID = function( templateElementID )
{
    return XWeb.UI.Templates.GetTemplate( $get( templateElementID ) );
}

XWeb.UI.Templates.ParseFinal = function( template, allArgs )
{
    var result = template;
    
    for ( var n = 1; n < allArgs.length; n++ )
    {
        if ( typeof(allArgs[n]) == "string" )
        {
            if ( allArgs.length <= n+1 || allArgs[n] == allArgs[n+1] )
                continue;
                
            var search = "$$" + allArgs[n];
            
            while ( result.indexOf( search ) >= 0 )
                result = result.replace( search, allArgs[n+1] );
                
            n++;
        }
        else
        {
            for ( attribute in allArgs[n] )
            {
                var search = "$$" + attribute;
            
                while ( result.indexOf( search ) >= 0 )
                    result = result.replace( search, allArgs[n][attribute] );
            }
        }
    }
        
    return result;
}









// ------------------------------------------------------------------------------------
// XWeb.OnLoad ------------------------------------------------------------------------
// ------------------------------------------------------------------------------------

XWeb.OnLoad = new Object();
XWeb.OnLoad.Handlers = new Array();

XWeb.OnLoad.AddFunction = function(func)
{
   var oldonload = window.onload;
   
   if (typeof window.onload != 'function')
   {
      window.onload = func;
   }
   else
   {
      window.onload = function()
      {
        oldonload();
        func();
      }
   }
}


XWeb.OnLoad.Register = function( handler )
{
    var e = Function._validateParams(arguments, [
        {name: "handler", type: Function}
    ]);
    if (e) throw e;

    //if ( !XWeb.OnLoad.Registered( handler ) )
        XWeb.OnLoad.Handlers.push( handler );
}

//XWeb.OnLoad.Registered = function ( handler )
//{
//    var e = Function._validateParams(arguments, [
//        {name: "handler", type: Function}
//    ]);
//    if (e) throw e;

//    for ( n = 0; n < XWeb.OnLoad.Handlers.length; n++ )
//    {
//        if ( XWeb.OnLoad.Handlers[n].name == handler.name )
//            return true;
//    }
//    
//    return false;
//}

XWeb.OnLoad.Perform = function()
{
    for ( n = 0; n < XWeb.OnLoad.Handlers.length; n++ )
    {
        var handler = XWeb.OnLoad.Handlers[n];
        
        if ( handler )
            handler();
    }
}






// ------------------------------------------------------------------------------------
// XWeb.OnInit ------------------------------------------------------------------------
// ------------------------------------------------------------------------------------

XWeb.OnInit = new Object();
XWeb.OnInit.Handlers = new Array();

XWeb.OnInit.Register = function( handler )
{
    var e = Function._validateParams(arguments, [
        {name: "handler", type: Function}
    ]);
    if (e) throw e;

    //if ( !XWeb.OnInit.Registered( handler ) )
        XWeb.OnInit.Handlers.push( handler );
}

//XWeb.OnInit.Registered = function ( handler )
//{
//    var e = Function._validateParams(arguments, [
//        {name: "handler", type: Function}
//    ]);
//    if (e) throw e;

//    for ( n = 0; n < XWeb.OnInit.Handlers.length; n++ )
//    {
//        if ( XWeb.OnInit.Handlers[n].name == handler.name )
//            return true;
//    }
//    
//    return false;
//}

XWeb.OnInit.Perform = function()
{
    for ( n = 0; n < XWeb.OnInit.Handlers.length; n++ )
    {
        var handler = XWeb.OnInit.Handlers[n];
        
        if ( handler )
            handler();
    }
}




// ------------------------------------------------------------------------------------
// XWeb.Net ---------------------------------------------------------------------------
// ------------------------------------------------------------------------------------


XWeb.Net = new Object();

XWeb.Net.MarkupProviderUrl = null;
XWeb.Net.DataProviderUrl = null;

XWeb.Net.CreateMarkupRequest = function()
{
    return XWeb.Net.CreateWebRequest( XWeb.Net.MarkupProviderUrl, arguments );
}

XWeb.Net.CreateDataRequest = function()
{
    var wRequest = XWeb.Net.CreateWebRequest( XWeb.Net.DataProviderUrl, arguments );
    
    wRequest.data = null;
    
    wRequest.add_completed( XWeb.Net.HandleDataRequest );
    
    return wRequest;
}

XWeb.Net.HandleDataRequest = function( executor, eventArgs )
{
    var wRequest = executor.get_webRequest();
    var statusCode = executor.get_statusCode();
    
    if ( statusCode >= 200 && statusCode < 300 )
    {
        wRequest.data = eval( executor.get_responseData() );
    }
}

XWeb.Net.CreateWebRequest = function( providerUrl, allArguments )
{
    var params = new Object();
    
    try
    {
        params = XWeb.Net.CreateRequestParameters( allArguments );
    }
    catch ( ex )
    {
        throw "Invalid request parameters";
    }
    
    var wRequest = new Sys.Net.WebRequest(); // thank you, Microsoft
    var url = XWeb.Net.CreateRequestUrl( providerUrl, params );
    
    wRequest.set_url( url ); // awful accessors
    
    return wRequest;
}

XWeb.Net.CreateRequestParameters = function( params )
{
    var result = new Object();

    result.method = params[0];
    
    for ( var n = 1; n < params.length; n++ )
    {
        if ( params[n+1] )
            result[params[n]] = params[n+1];
    }
    
    return result;
}

XWeb.Net.CreateRequestUrl = function( url, params )
{
    var result = url + "?";
    var isFirst = true;
    
    for ( var p in params )
    {
        if ( !isFirst )
            result += "&";
        else
            isFirst = false;
        
        result += p + "=" + params[p];
    }
    
    return result;
}





















