;
///<reference path="~/_common/main.js" />

Type.registerNamespace("MyVi.Instance");
MyVi.Instance.Iterators = {};
MyVi.Instance.Controls = {};


Type.registerNamespace("MyVi.Client.Utils");
MyVi.Client.Utils.ParseQueryString = function (url)
{
	var rval = {};
	if(!url) url = document.URL;
	var qsStart = url.indexOf('?');
	if (qsStart !== -1)
	{
		var queryString = url.substr(qsStart+1, url.length-qsStart-1);
		var params = queryString.split('&');
		for(var i=0;i<params.length;i++)
		{
			var parts = params[i].split('=');
			rval[parts[0]] = parts.length>1?parts[1]:undefined;
		}
	}
	
	return rval;
}
MyVi.Client.Utils.CreateQueryString = function (query_params, url)
{
	var rval = "";
	if(!url) url = document.URL;
	var qsStart = url.indexOf('?');
	if (qsStart !== -1) url = url.substr(0, qsStart);
	rval = url;
	var sep = '?';
	for(it1 in query_params)
	{
		rval = rval + sep + it1;
		if(query_params[it1]) rval = rval + '=' + query_params[it1];
		sep = '&';
	}
	return rval;
}
MyVi.Client.Utils.ExcludeQueryParams = function(query_params,exclude_params)
{
	var rval = {};
	
	for(it1 in query_params)
	{
		var paramName = it1.toLowerCase();
		for (it2 in exclude_params)
			if(it2.toLowerCase() != paramName) rval[it1] = query_params[it1];
	}
	
	return rval;
}

MyVi.Client.Utils.TemplateIDCounter = 0;

MyVi.Client.Utils.CreateNewTemplateID = function()
{
    return MyVi.Client.Utils.TemplateIDCounter++;   
}

Type.registerNamespace("MyVi.Client.Controls");


//BaseControl class
MyVi.Client.Controls.BaseControl = function(data) {
	for (val in data) {
		if (val.charAt(0) != "_" && !(data[val] instanceof Function))
			this[val] = data[val];
	}
}
function MyVi$Client$Controls$BaseControl$get_events()
{
	if (!this._events)
		this._events = new Sys.EventHandlerList();
	return this._events;
}
MyVi.Client.Controls.BaseControl.prototype = 
{
	get_events:MyVi$Client$Controls$BaseControl$get_events,
	GetObject:function(data_context)
	{
		var rval = undefined;
		if(typeof(data_context)=="string")
		{
			var startChar = data_context.charAt(0);
			try
			{
				if(startChar=='.')
					data_context = "MyVi.Instance.Controls"+data_context;
					
				if(startChar=='#')
					rval = jQuery(data_context);
				else
					rval = eval(data_context);
			}
			catch(e)
			{
			}
		}
		else rval = data_context;
		
		return rval;
	}
}
MyVi.Client.Controls.BaseControl.registerClass("MyVi.Client.Controls.BaseControl");


//BaseBindings class
MyVi.Client.Controls.BaseBindings = function(data)
{
	MyVi.Client.Controls.BaseBindings.initializeBase(this,[data]);
	if(this.Bindings!=null)
	{
		var bindings = this.Bindings;
		this.Bindings = null;
		for(var i=0;i<bindings.length;i++)
			this.AddBinding(bindings[i]);
	}
};
MyVi.Client.Controls.BaseBindings.prototype =
{
    _isBindingInitialize: false,
    Bindings: null,
    AddBinding: function(binding) {
        if (this.Bindings == null)
            this.Bindings = new Array();

        if (!Object.getType(binding).inheritsFrom(MyVi.Client.Controls.Binding))
            binding = new MyVi.Client.Controls.Binding(binding);

        this.Bindings.push(binding);

        if (this._isBindingInitialize) this._InitializeBinding(binding);
    },
    DataBind: function() {
        var rval = { _error: false, _exceptions: new Array() };
        this.BeforeBindings();

        if (this.Bindings != null) {
            for (var i = 0; i < this.Bindings.length; i++) {
                var binding = this.Bindings[i];
                try { binding.ExecuteBinding(this); }
                catch (ex) { rval._error = true; rval._exceptions.push(ex); }
            }
        }
        this.EndExecuteBindings(rval);
    },
    BeginExecuteBindings: function(callback) {
        var lastBindings = {};
        var rval = { _error: false, _exceptions: undefined };
        var target = this;
        var bind = function(n, i, bindings) {
            var binding = bindings[i];
            var lastData = typeof (binding.DataContext) == "string" ? lastBindings[binding.DataContext] : undefined;
            if (lastData == undefined) {
                binding.BeginExecuteBinding(target, function(async_result) {
                    if (typeof (binding.DataContext) == "string")
                        lastBindings[binding.DataContext] = async_result;
                    try { binding.EndExecuteBinding(async_result); }
                    catch (ex) { rval._error = true; rval._exceptions = ex; }
                    n(bind, i + 1, bindings);
                });
            }
            else {
                try { binding.EndExecuteBinding(lastData); }
                catch (ex) { rval._error = true; rval._exceptions = ex; }
                n(bind, i + 1, bindings);
            }
        };
        var next = function(b, i, bindings) {
            if (i < bindings.length)
                b(next, i, bindings);
            else {
                target.AfterBindings();
                callback(rval);
            }
        };

        this.BeforeBindings();

        if (this.Bindings != null)
            next(bind, 0, this.Bindings);
        else
            callback(rval);

        return rval;
    },
    EndExecuteBindings: function(async_result) {
        if (async_result._error)
            throw async_result._exceptions;
    },
    BeforeBindings: function() {
        this._InitializeBindings();
    },
    AfterBindings: function() {
    },
    SetDefaultDataContext: function(default_data_context) {
        if (this.Bindings != null) {
            for (var i = 0; i < this.Bindings.length; i++) {
                this.Bindings[i].SetDefaultDataContext(default_data_context);
            }
        }
    },
    OnDataChanged: function(sender, args) {
        this.DataBind();
    },
    _InitializeBinding: function(binding) {
        var srcObject = binding.GetObject(binding.GetDataContext());
        if (Object.getType(srcObject).inheritsFrom(MyVi.Client.Controls.BaseDataView))
            srcObject.AddSubscriber(this);
    },
    _InitializeBindings: function() {
        if (!this._isBindingInitialize) {
            for (it in this.Bindings) {
                if (!(this.Bindings[it] instanceof Function))
                    this._InitializeBinding(this.Bindings[it]);
            }
            this._isBindingInitialize = true;
        }
    }
};
MyVi.Client.Controls.BaseBindings.registerClass("MyVi.Client.Controls.BaseBindings",MyVi.Client.Controls.BaseControl);


//Binding class
MyVi.Client.Controls.Binding = function(data)
{
	this.DSParams = {};
	MyVi.Client.Controls.Binding.initializeBase(this,[data]);
};
MyVi.Client.Controls.Binding.prototype =
{
	_defaultDataContext:null,
	DSParams:null,
	DataContext:null,
	DataPath:null,
	Property:null,
	PropertyKey:null,
	GetDataContext:function()
	{
		return this.DataContext!=null?this.DataContext:this._defaultDataContext;
	},
	SetDefaultDataContext:function(default_data_context)
	{
		this._defaultDataContext=default_data_context;
	},
	ExecuteBinding:function(target)
	{
		try
		{
			this.DataBind();
			var srcObject = this.GetObject(this.GetDataContext());
			if(Object.getType(srcObject).inheritsFrom(MyVi.Client.Controls.BaseDataSource))
				throw "Can't ExecuteBinding for 'MyVi.Client.Controls.BaseDataSource' DataContext type";
			this.EndExecuteBinding({_data:srcObject, _target:target, _exception:null});
		}
		catch(ex)
		{
			this.EndExecuteBinding({_data:null, _target:target, _exception:ex});
		}
		
	},
	BeginExecuteBinding:function(target, callback)
	{
		var rval = {_data:null, _target:target, _exception:null};
		try
		{
			this.DataBind();
			var srcObject = this.GetObject(this.GetDataContext());
			
			if(Object.getType(srcObject).inheritsFrom(MyVi.Client.Controls.BaseDataSource))
			{
				srcObject.BeginExecuteSelect(function(async_result)
				{
					try{ rval._data = srcObject.EndExecuteSelect(async_result); }
					catch(ex){ rval._exception = ex; }
					callback(rval);
				}, this.DSParams);
			}
			else
			{
				rval._data = srcObject;
				callback(rval);
			}
		}
		catch(ex)
		{
			rval._exception = ex;
			callback(rval);
		}
		
		return rval;
	},
	EndExecuteBinding:function(async_result)
	{
		var path = this.DataPath!=null?this.DataPath.split("."):[];
		var i;
		var dataContext;
		var srcObject = async_result._data;
		var target = async_result._target;
		
		if(async_result._exception!=null)
			throw async_result._exception;
		
		if(srcObject.jquery!=null)
		{
			var domElArr = srcObject.get();
			if(domElArr.length == 1) dataContext = domElArr[0];
		}
		else
			dataContext = srcObject;
		
		for(i=0;i<path.length;i++)
			dataContext = dataContext[path[i]];
		
		var propertyName = this.Property;
		if(this.PropertyKey!=null)
		{
			target = target[this.Property];
			propertyName = this.PropertyKey;
		}
		
		target[propertyName]=dataContext;
	}
};
MyVi.Client.Controls.Binding.registerClass("MyVi.Client.Controls.Binding",MyVi.Client.Controls.BaseBindings);


//BaseDataBoundControl class
MyVi.Client.Controls.BaseDataBoundControl = function (data)
{
	MyVi.Client.Controls.BaseDataBoundControl.initializeBase(this,[data]);
	
	var target = this;
	if(this.AutoBind)
		jQuery(document).ready(function()
		{
			if(!target._isDataBinding)
				target.DataBind();
		});
	
}

MyVi.Client.Controls.BaseDataBoundControl.prototype = 
{
	Id:"",
	ItemsData:null,
	LayoutData:null,
	AutoBind:false,
	_isDataBinding:false,
	_errorData:null,
	DataBind:function()
	{
		this._isDataBinding = true;
		this._errorData = null;
		var target = this;
		this.BeginExecuteBindings(function(async_result)
		{
			try{target.EndExecuteBindings(async_result);}
			catch(ex){target._errorData=ex};
			target.PerformDataBinding(target._errorData!=null?target._errorData:target.ItemsData);
			target.CreateChildControl();
		});
	},
	PerformDataBinding:function(data)
	{
	},
	ClearChildControls:function()
	{
		jQuery(this.Id).empty();
	},
	CreateChildControl:function()
	{
	}
}
MyVi.Client.Controls.BaseDataBoundControl.registerClass("MyVi.Client.Controls.BaseDataBoundControl", MyVi.Client.Controls.BaseBindings);


//BaseDataSource class
MyVi.Client.Controls.BaseDataSource = function (data)
{
	this.Parameters = {};
	MyVi.Client.Controls.BaseDataSource.initializeBase(this,[data]);
	
};
MyVi.Client.Controls.BaseDataSource.prototype =
{
	Parameters:null,
	BeginExecuteSelect:function(callback, data_source_params)
	{
		var target = this;
		var rval = {_data:undefined, _exception:null};
		
		if(data_source_params)
		{
			for(it in data_source_params)
				this.Parameters[it] = data_source_params[it];
		}
		
		this.BeginExecuteBindings(function(async_result)
		{
			try { target.EndExecuteBindings(async_result); }
			catch (ex) { rval._exception = ex; };
			if(rval._exception!=null)
				callback(rval);
			else
				target._ExecuteSelect(rval, callback);
		});
		
		return rval;
	},
	EndExecuteSelect:function(async_result)
	{
		if(async_result._data!=null && async_result._data.isAPIException)
			throw async_result._data;
		if(async_result._exception!=null)
			throw async_result._exception;
		return async_result._data;
	},
	_ExecuteSelect:function(return_value, callback)
	{
		throw "Not Implemented";
	}
}
MyVi.Client.Controls.BaseDataSource.GetRequestURL = function(template,params)
{
	var rval = template;
	for(paramName in params)
	{
		rval = "";
		var parts = template.split("{"+paramName+"}");
		var i = 0;
		for(;i<parts.length;i++)
		{
		    if (i > 0) rval += encodeURI(params[paramName]);
			rval += parts[i];
		}
		template = rval;
	}
	return rval;
}
MyVi.Client.Controls.BaseDataSource.registerClass("MyVi.Client.Controls.BaseDataSource", MyVi.Client.Controls.BaseBindings);


//BaseDataView class
MyVi.Client.Controls.BaseDataView = function (data)
{
	this._onDataChangeSubcribers = [];
	this._onExecuteSelectSubscribers = [];
	MyVi.Client.Controls.BaseDataView.initializeBase(this,[data]);
}
MyVi.Client.Controls.BaseDataView.prototype =
{
    _exception: null,
    _isExecuteSelect: false,
    Data: null,
    Paging: { PageSize: 10, PageNum: 1 },
    QueryStringField: undefined,
    _onDataChangeSubcribers: null,
    _onExecuteSelectSubscribers: null,
    add_ChangeDataEvent: function(delegate) {
        this.get_events().addHandler("OnChangeData", delegate);
    },
    DataBind: function() {
        var target = this;
        this._isExecuteSelect = true;
        this.Data = {};
        this._exception = null;

        if (this.QueryStringField) this.InitializeFromQuery(MyVi.Client.Utils.ParseQueryString());

        rval = MyVi.Client.Controls.BaseDataView.callBaseMethod(this, "BeginExecuteSelect", [function(async_result) {
            try { target.EndExecuteSelect(async_result); }
            catch (ex) { target._exception = ex; };
            target._isExecuteSelect = false;
            for (it in target._onExecuteSelectSubscribers) {
                var delegate = target._onExecuteSelectSubscribers[it];
                try {
                    if (delegate instanceof Function)
                        delegate(target, async_result);
                } catch (e) {
                }
            };
            target._onExecuteSelectSubscribers = [];
        }, undefined]);
    },
    BeginExecuteSelect: function(callback, data_source_params) {
        var target = this;
        var rval = { _data: this, _exception: this._exception };
        var call = callback;
        if (this._isExecuteSelect || this.Data == null) {
            var delegate = function(sender, args) {
                if (args._exception == null) {
                    args._data = target;
                    call(args);
                }
                else
                    call(args);
            };
            this._onExecuteSelectSubscribers.push(delegate);
        }
        else if (rval._exception == null)
            this._ExecuteSelect(rval, callback);
        else callback(rval);

        return rval;
    },
    _ExecuteSelect: function(return_value, call_back) {
        return_value._data = this;
        call_back(return_value);
    },
    ChangeData: function() {
        var target = this;
        this._isExecuteSelect = true;
        this.Data = {};
        this._exception = null;
        rval = MyVi.Client.Controls.BaseDataView.callBaseMethod(this, "BeginExecuteSelect", [function(async_result) {
            try { target.EndExecuteSelect(async_result); }
            catch (ex) { target._exception = ex; };
            target._isExecuteSelect = false;
            target.get_events().getHandler("OnChangeData")(target, target);
        }, undefined]);
    },
    SetQueryParam: function(query_param, param_name, param_value) {
        var prefix = this.QueryStringField ? this.QueryStringField : "";
        query_param[prefix + param_name] = param_value;
    },
    SetQueryParams: function(query_params) {
        this.SetQueryParam(query_params, "pn", this.Paging.PageNum);
    },
    InitializeFromQuery: function(query_params) {
        var pagenum = query_params[this.QueryStringField + "pn"];
        if (pagenum) this.Paging.PageNum = pagenum;
    },
    GetGoPageUrl: function(page_num, base_url) {
        throw "Not Implemented";
    },
    GetGoPageEventHandler: function(page_num) {
        throw "Not Implemented";
    },
    AddSubscriber: function(subscriber) {
        if (Object.getType(subscriber).inheritsFrom(MyVi.Client.Controls.BaseBindings)) {
            if (Array.indexOf(this._onDataChangeSubcribers, subscriber, 0) == -1) {
                Array.add(this._onDataChangeSubcribers, subscriber);
                this.add_ChangeDataEvent(Function.createDelegate(subscriber, subscriber.OnDataChanged));
            }
        }
    }
}
MyVi.Client.Controls.BaseDataView.registerClass("MyVi.Client.Controls.BaseDataView", MyVi.Client.Controls.BaseDataSource);


//Element class
MyVi.Client.Controls.Element = function(data)
{
	MyVi.Client.Controls.Element.initializeBase(this,[data]);
}
MyVi.Client.Controls.Element.prototype =
{
	Id: undefined,
	GetMapList: function()
	{
		return {};
	},
	MapDataToElement: function(dst_container)
	{
		var element = jQuery(this.Id, dst_container);
		var target = this;
		if (element != null)
		{
			element.each(function()
			{
				var map = target.GetMapList();
				var map2 = new Object();
				for (val in map)
				{
					if (!(target[val] instanceof Function) && target[val] != null && target[val] != undefined)
					{
						if (map[val] != "innerHTML") this[map[val]] = target[val];
						else map2[val] = map[val];
					}
				}
				for (val in map2)
				{
					if (!(target[val] instanceof Function) && target[val] != null && target[val] != undefined)
						this[map2[val]] = target[val];
				}
			});
		}
	}
}
MyVi.Client.Controls.Element.registerClass("MyVi.Client.Controls.Element",MyVi.Client.Controls.BaseBindings);


//Literal class
MyVi.Client.Controls.Literal = function(data)
{
	MyVi.Client.Controls.Literal.initializeBase(this,[data]);
}
MyVi.Client.Controls.Literal.prototype =
{
    Text: undefined,
    SomeFunc: undefined,
    WBRLimit: null,
    MapDataToElement: function(dst_container) {
        if (this.Text) {
                jQuery(jQuery(dst_container)).append(this.Text);
        }
    }
}
MyVi.Client.Controls.Literal.registerClass("MyVi.Client.Controls.Literal",MyVi.Client.Controls.Element);

//Option class
MyVi.Client.Controls.Option = function(data)
{
	MyVi.Client.Controls.Option.initializeBase(this,[data]);
}
MyVi.Client.Controls.Option.prototype = 
{
    Text:undefined,
    Value:undefined,
	MapDataToElement:function(dst_container)
	{
	    if(this.Text)
		    jQuery(jQuery(dst_container)).append(this.Text);
		    
	    if(this.Value)
		    jQuery(jQuery(dst_container)).attr("value", this.Value);
		    
	}
}
MyVi.Client.Controls.Option.registerClass("MyVi.Client.Controls.Option",MyVi.Client.Controls.Element);

function InsertWBRTag(src, max_length) {
    var s = "";
    var rval = "";
    var arr = src.split(" ");
    for (var i = 0; i < arr.length; i++) {
        if (arr[i].length > max_length) {
            s = arr[i];
            do {
                rval += s.substr(0, max_length).replace(/&/g, "&amp;");
                rval += "&&";
                s = s.substr(max_length);
            } while (s.length > max_length);
            rval += s.replace(/&/g, "&amp;");
        } else {
            rval += arr[i].replace(/&/g, "&amp;");
        }
        rval += " ";
    }
    rval = rval.substr(0, rval.length - 1);
    return rval.replace(/</g, "&lt;").replace(/&&/g, "<wbr/>");
}

//Label class
MyVi.Client.Controls.Label = function(data)
{
	MyVi.Client.Controls.Label.initializeBase(this,[data]);
}
MyVi.Client.Controls.Label._mapList = null;
MyVi.Client.Controls.Label.prototype =
{
    TextLimit: null,
    WBRLength: null,
    GetMapList: function() {
        var rval = MyVi.Client.Controls.Label._mapList;
        if (rval == null) {
            rval = new MyVi.Client.Controls.BaseControl(MyVi.Client.Controls.Label.callBaseMethod(this, "GetMapList"));
            rval.text = "innerHTML";
            MyVi.Client.Controls.Label._mapList = rval;
        }

        return rval;
    },
    MapDataToElement: function(dst_container) {
        if (this.text) {
            var element = jQuery(this.Id, dst_container);
            if (this.TextLimit != null && Number(this.TextLimit) != Number.NaN && Number(this.TextLimit) > 3 && String(this.text).length > Number(this.TextLimit) - 3)
                this.text = String(this.text).substring(0, Number(this.TextLimit) - 3) + "...";
            if (this.WBRLength != null) //todo:какие проверки?
                this.text = InsertWBRTag(this.text, this.WBRLength);
        }
        MyVi.Client.Controls.Label.callBaseMethod(this, "MapDataToElement", [dst_container]);
    }
}
MyVi.Client.Controls.Label.registerClass("MyVi.Client.Controls.Label",MyVi.Client.Controls.Element);


//SimpleCreate class
MyVi.Client.Controls.SimpleCreate = function(data) {
    MyVi.Client.Controls.SimpleCreate.initializeBase(this, [data]);
}
MyVi.Client.Controls.SimpleCreate.prototype =
{
    Data: undefined,
    Create: undefined,
    MapDataToElement: function(dst_container) {
        if (this.Data && this.Create)
            this.Create(jQuery(this.Id, dst_container), this.Data);
    }
}
MyVi.Client.Controls.SimpleCreate.registerClass("MyVi.Client.Controls.SimpleCreate", MyVi.Client.Controls.Element);

MyVi.Client.Controls.Image = function(data)
{
	MyVi.Client.Controls.Image.initializeBase(this,[data]);
}
MyVi.Client.Controls.Image._mapList = null;
MyVi.Client.Controls.Image.prototype =
{
	GetMapList: function() {
		var rval = MyVi.Client.Controls.Image._mapList;
		if (rval == null) {
			rval = new MyVi.Client.Controls.BaseControl(MyVi.Client.Controls.Image.callBaseMethod(this, "GetMapList"));
			rval.url = "src";
			MyVi.Client.Controls.Image._mapList = rval;
		}

		return rval;
	},
	MapDataToElement: function(dst_container) {
		if (this.title) {
			var element = jQuery(this.Id, dst_container);
			element.attr("alt", this.title);
			element.attr("title", this.title);
		}

		MyVi.Client.Controls.Image.callBaseMethod(this, "MapDataToElement", [dst_container]);
	}
}
MyVi.Client.Controls.Image.registerClass("MyVi.Client.Controls.Image",MyVi.Client.Controls.Element);


//JavascriptExecuter
MyVi.Client.Controls.JavascriptExecuter = function(data)
{
	MyVi.Client.Controls.JavascriptExecuter.initializeBase(this,[data]);
}
MyVi.Client.Controls.JavascriptExecuter._mapList = null;
MyVi.Client.Controls.JavascriptExecuter.prototype = 
{
	GetMapList:function()
	{
		var rval = MyVi.Client.Controls.JavascriptExecuter._mapList;
		if(rval==null)
		{
			rval = new MyVi.Client.Controls.BaseControl(MyVi.Client.Controls.JavascriptExecuter.callBaseMethod(this,"GetMapList"));
			MyVi.Client.Controls.JavascriptExecuter._mapList = rval;
		}
		
		return rval;
	},
	MapDataToElement:function(dst_container)
	{
		var element = jQuery(this.Id, dst_container);
		//element.attr("alt",this.title);
		//element.attr("title",this.title);
			
		MyVi.Client.Controls.JavascriptExecuter.callBaseMethod(this,"MapDataToElement",[dst_container]);
	}
}
MyVi.Client.Controls.JavascriptExecuter.registerClass("MyVi.Client.Controls.JavascriptExecuter",MyVi.Client.Controls.Element);


//Link class
MyVi.Client.Controls.Link = function(data) {
	MyVi.Client.Controls.Link.initializeBase(this, [data]);
	if (data.click instanceof Function)
		this.click = data.click;
}
MyVi.Client.Controls.Link._mapList = null;
MyVi.Client.Controls.Link.prototype =
{
	TemplateUrl: undefined,
	TemplateParams: undefined,
	GetMapList: function() {
		var rval = MyVi.Client.Controls.Link._mapList;
		if (rval == null) {
			rval = new MyVi.Client.Controls.BaseControl(MyVi.Client.Controls.Link.callBaseMethod(this, "GetMapList"));
			rval.url = "href";
			rval.title = "title";
			MyVi.Client.Controls.Link._mapList = rval;
		}

		return rval;
	},
	MapDataToElement: function(dst_container) {
		if (!this.url && this.TemplateUrl) {
			//alert("this.TemplateUrl - " + this.TemplateUrl);
			this.url = MyVi.Client.Controls.BaseDataSource.GetRequestURL(this.TemplateUrl, this.TemplateParams);
			//alert("this.url - " + this.url);
		}
		else if (!this.url) this.url = "javascript:";
		if (this.enabled == false) this.url = null;

		var element = jQuery(this.Id, dst_container);
		if (this.click instanceof Function && element.jquery != null && !(this.enabled == false))
			element.bind("click", new MyVi.Client.Controls.Link(this), this.click);
		else {
			if (this.enabled == false) {
				element.replaceWith("<span id='" + element.attr("id") + "'>" + element.html() + "</span>");
			}
		}
		MyVi.Client.Controls.Link.callBaseMethod(this, "MapDataToElement", [dst_container]);

		if (this.TemplateUrl) this.url = undefined;
	}
}
MyVi.Client.Controls.Link.registerClass("MyVi.Client.Controls.Link",MyVi.Client.Controls.Label);


//CheckBox class
MyVi.Client.Controls.CheckBox = function(data)
{
	MyVi.Client.Controls.CheckBox.initializeBase(this, [data]);
}
MyVi.Client.Controls.CheckBox._mapList = null;
MyVi.Client.Controls.CheckBox.prototype =
{
	GetMapList: function()
	{
		var rval = MyVi.Client.Controls.CheckBox._mapList;
		if (rval == null)
		{
			rval = new MyVi.Client.Controls.BaseControl(MyVi.Client.Controls.CheckBox.callBaseMethod(this, "GetMapList"));
			rval.name = "name";
			rval.type = "type";
			rval.value = "value";
			rval.checked = "checked";
			MyVi.Client.Controls.CheckBox._mapList = rval;
		}

		return rval;
	},
	MapDataToElement: function(dst_container)
	{
		if (!this.type) this.type = "checkbox";
		//if (this.enabled == false) this.url = "";

		//var element = jQuery(this.Id, dst_container);
		//if (this.click instanceof Function && element.jquery != null && !(this.enabled == false))
		//	element.bind("click", this.click);

		MyVi.Client.Controls.CheckBox.callBaseMethod(this, "MapDataToElement", [dst_container]);
	}
}
MyVi.Client.Controls.CheckBox.registerClass("MyVi.Client.Controls.CheckBox", MyVi.Client.Controls.Element);


//Flash class
MyVi.Client.Controls.Flash = function(data)
{
	MyVi.Client.Controls.Flash.initializeBase(this,[data]);
}
MyVi.Client.Controls.Flash._mapList = null;
MyVi.Client.Controls.Flash.prototype = 
{
	GetMapList:function()
	{
		var rval = MyVi.Client.Controls.Flash._mapList;
		if(rval==null)
		{		    
			rval = new MyVi.Client.Controls.BaseControl(MyVi.Client.Controls.Flash.callBaseMethod(this,"GetMapList"));
		}
		
		return rval;
	},
	MapDataToElement:function(dst_container)
	{
		var element = jQuery(this.Id, dst_container);
		
		MyVi.Client.Controls.Flash.callBaseMethod(this,"MapDataToElement",[dst_container]);
		
		element.after("<object id='"+ element.attr("id") +"' width='450' height='380'>" + 
			"<param name='movie' value='" + this.playerUrl + "'>" + 
			"<embed type='application/x-shockwave-flash'" + 
				"src='" + this.playerUrl + "' width='450' height='380'" +
				"allowfullscreen='true' quality='high' wmode='window'" +
				"bgcolor='#ffffff' />" + 
			"<noembed>" + 
			"</noembed>" + 
		"</object>");		
		element.remove();
	}
}
MyVi.Client.Controls.Flash.registerClass("MyVi.Client.Controls.Flash",MyVi.Client.Controls.Element);

//FlashVix class

MyVi.Client.Controls.FlashVix = function(data) {
MyVi.Client.Controls.FlashVix.initializeBase(this, [data]);
}
MyVi.Client.Controls.FlashVix._mapList = null;
MyVi.Client.Controls.FlashVix.prototype =
{
    playerUrl: null,
    playerWidth: 450,
    playerHeight: 380,
    GetMapList: function() {
        var rval = MyVi.Client.Controls.FlashVix._mapList;
        if (rval == null) {
            rval = new MyVi.Client.Controls.BaseControl(MyVi.Client.Controls.FlashVix.callBaseMethod(this, "GetMapList"));
        }

        return rval;
    },
    MapDataToElement: function(dst_container) {
        var element = jQuery(this.Id, dst_container);
        MyVi.Client.Controls.FlashVix.callBaseMethod(this, "MapDataToElement", [dst_container]);

        if (this.mediaType == "flash") {
            element.after("<object id='" + element.attr("id") + "' width='" + this.playerWidth + "' height='" + this.playerHeight + "'>" +
			"<param name='movie' value='" + this.playerUrl + "'>" +
			"<embed type='application/x-shockwave-flash'" +
				"src='" + this.playerUrl + "' width='" + this.playerWidth + "' height='" + this.playerHeight + "'" +
				"allowfullscreen='true' quality='high' wmode='opaque'" +
				"bgcolor='#ffffff' />" +
			"<noembed>" +
			"</noembed>" +
		"</object>");
        } else {
            element.after("<img width='" + this.playerHeight + "' height='" + this.playerHeight + "' src='" + this.playerUrl + "' />");
        }
        element.remove();
    }
}
MyVi.Client.Controls.FlashVix.registerClass("MyVi.Client.Controls.FlashVix", MyVi.Client.Controls.Element);

//VideoPlayer class
MyVi.Client.Controls.VideoPlayer = function(data) 
{
	MyVi.Client.Controls.VideoPlayer.initializeBase(this, [data]);
}
MyVi.Client.Controls.VideoPlayer.prototype =
{
    ShowTitle: "true",
    Create: function(container, data) {
    var title = "";
    if (this.ShowTitle == "true" || this.ShowTitle == null)
        title = "<h2>" + data.Detail.title + "</h2>";
    container.html(
		title +
		data.Embed.object + " "
	);
    }
}
MyVi.Client.Controls.VideoPlayer.registerClass("MyVi.Client.Controls.VideoPlayer", MyVi.Client.Controls.SimpleCreate);

//VideoDetailCtrl
MyVi.Client.Controls.VideoDetailCtrl = function(data) 
{
	MyVi.Client.Controls.VideoDetailCtrl.initializeBase(this, [data]);
}
MyVi.Client.Controls.VideoDetailCtrl.prototype =
{
	_form: "",
	Link: null,
	ImageUrl: null,
	Duration: null,
	Title: null,
	Description: null,
	ViewsCnt: null,
	AuthorName: null,
	UploadDate: null,
	LinkColor: "blue",
	TextColor: "black",
	IsShort: false,
	IsSimpleList: false,
	MapDataToElement: function(dst_container) {
		if (this.IsShort) {
            this._form =
            "<div style=\"width:100%\">" +
                "<div style=\"width:125px;float:left\">" +
                    "<a href=\"" + this.Link + "\">" +
                        "<img src=\"" + this.ImageUrl + "\" width=\"125px\" height=\"93\" alt=\"" + this.Title + "\" />" +
                    "</a>" +
                "</div>" +
                "<div style=\"margin-left:140px;\">" +
                    "<dl style=\"margin:0;position:relative\">" +
                        "<dt style=\"width:60%\">" +
                            "<a href=\"" + this.Link + "\" style=\"color:" + this.LinkColor + "\">" + this.Title + "</a>" +
                        "</dt>" +
                        "<dd style=\"position:absolute;top:0px;left:60%;width:40%;margin:0;font-weight:bold; color:" + this.TextColor + "\">" + this.Duration + "</dd>" +
                    "</dl>" +
                    "<ul style=\"list-style:none;margin:20px 0 0 0;padding:0; color:" + this.TextColor + "\">" +
                        "<li style=\"\">" +
                            "<strong>" + MyVi.Instance.Localization.PublicList.ViewsCnt + "</strong>" +
                            "<span>" + this.ViewsCnt + "</span>" +
                        "</li>" +
                        "<li>" +
                            "<strong>" + MyVi.Instance.Localization.PublicList.UploadDate + "</strong>" +
                            "<span>" + this.UploadDate + "</span>" +
                        "</li>" +
                    "</ul>" +
                "</div>" +
            "</div>";
        }
        else if (!this.IsSimpleList) {
            this._form =
            "<td style=\"vertical-align:top\">" +
                "<a href=\"" + this.Link + "\">" +
                    "<img src=\"" + this.ImageUrl + "\" alt=\"" + this.Title + "\" title=\"" + this.Title + "\" width=\"125px\" height=\"93px\" />" +
                "</a>" +
            "</td>" +
            "<td style=\"width:100%;padding-left:20px;vertical-align:top\">" +
                "<a href=\"" + this.Link + "\" style=\"float:left;width:70%;margin:-3px 0 0 5px;color:" + this.LinkColor + "\">" + this.Title + "</a>" +
                "<div style=\"float:left;margin-top:-3px; color:" + this.TextColor + ";\"><b>" + this.Duration + "</b></div>" +
                "<div style=\"clear:left;margin-left:5px; color:" + this.TextColor + ";\">" + this.Description + "</div><br />" +
                "<div style=\"float:left;width:45%;margin-right:3px;padding:5px;border-right:1px solid #d1d1d1; color:" + this.TextColor + "\">" +
                    "<strong>" + MyVi.Instance.Localization.PublicList.ViewsCnt + "</strong>" + this.ViewsCnt + 
                "</div>" +
                "<div style=\"border:1px solid #d1d1d1;padding:5px 0; color:" + this.TextColor + "\">" + this.UploadDate + "</div>" +
            "</td>";
        }
        else 
        {
            this._form =
            "<div style=\"width:100%;overflow:hidden\">" +
                "<div style=\"float:left;\">" +
					"<a href=\"" + this.Link + "\">" +
						"<img src=\"" + this.ImageUrl + "\" alt=\"" + this.Title + "\" title=\"" + this.Title + "\" width=\"90px\" height=\"67px\" />" +
					"</a>" +
                "</div>" +
				"<div style=\"margin-left:100px\"><a href=\"" + this.Link + "\" style=\"color:" + this.LinkColor + "\">" + this.Title + "</a>" +
                " (<strong style=\"color:" + this.TextColor + "\">" + this.Duration + "</strong>)" +
                "<div style=\"color:" + this.TextColor + "\">" + this.UploadDate + "</div></div>" +
            "</div>";
        }
        jQuery(jQuery(this.Id, dst_container)).after(this._form);
        jQuery(jQuery(this.Id, dst_container)).remove();
    }
}
MyVi.Client.Controls.VideoDetailCtrl.registerClass("MyVi.Client.Controls.VideoDetailCtrl", MyVi.Client.Controls.Element);

//TemplateContainer
MyVi.Client.Controls.TemplateContainer = function(data)
{
	MyVi.Client.Controls.TemplateContainer.initializeBase(this,[data]);
}
MyVi.Client.Controls.TemplateContainer.prototype =
{
	LayoutElement: undefined,
	Elements: null,
	RenderTemplate: function(place_holder_item, is_layout, data)
	{
		var exceptions = new Array();
		var placeHolderItem;
		if (typeof place_holder_item == "string" )
		{
			var parts = place_holder_item.split(" ");
			for (var i = 0; i < parts.length; i++)
			{
				if (placeHolderItem)
					placeHolderItem = jQuery(parts[i], placeHolderItem);
				else
					placeHolderItem = jQuery(parts[i]);
			}
		}
		else placeHolderItem = place_holder_item;

		if (data != null && this.LayoutElement != undefined)
		{
			var templateElement = jQuery(this.LayoutElement);

			var cloneElement = templateElement.clone();

			if (this.Elements != null)
			{
				for (var i2 = 0; i2 < this.Elements.length; i2++)
				{
					try
					{
						var element = this.Elements[i2];
						if (element != undefined)
						{
							element.SetDefaultDataContext(data);
							element.DataBind();
							if (Object.getType(element).inheritsFrom(MyVi.Client.Controls.Element))
								element.MapDataToElement(cloneElement);
						}
					}
					catch (ex)
					{
						exceptions.push(ex);
					}
				}
			}
			cloneElement.removeAttr("id");
			if (is_layout)
			{
				cloneElement.attr("id", placeHolderItem.attr("id"));
				placeHolderItem.replaceWith(cloneElement);
			}
			else
				placeHolderItem.before(cloneElement);
		}

		if (exceptions.length > 0)
			throw exceptions;
	}
}
MyVi.Client.Controls.TemplateContainer.registerClass("MyVi.Client.Controls.TemplateContainer",MyVi.Client.Controls.BaseControl);


//TemplateListContainer
MyVi.Client.Controls.TemplateListContainer = function(data)
{
	MyVi.Client.Controls.TemplateListContainer.initializeBase(this,[data]);
	if(this.Templates!=null)
	{
		for(var i=0;i<this.Templates.length;i++)
			this.Templates[i] = new MyVi.Client.Controls.TemplateContainer(this.Templates[i]);
	}
}
MyVi.Client.Controls.TemplateListContainer.prototype =
{
    PlaceHolderID: "#itemPlaceHolder",
	Templates:null,
	RenderTemplate:function(place_holder_item, is_layout, data, separator_template, template_name)
	{
		if(typeof(data.length)!="number") data = [data];
		
		if(this.Templates.length > 0)
		{
			for(var i=0;i<data.length;i++)
			{
				if(i>0 && i<(data.length) && separator_template)
					separator_template.RenderTemplate(place_holder_item,is_layout,[""], undefined, template_name);
				if(!template_name)
				    //this.Templates[i % this.Templates.length].RenderTemplate(place_holder_item, is_layout, data[i]);
				    this.Templates[0].RenderTemplate(place_holder_item, is_layout, data[i]);
			}
		}
	}
}
MyVi.Client.Controls.TemplateListContainer.registerClass("MyVi.Client.Controls.TemplateListContainer", MyVi.Client.Controls.BaseControl);


//LayoutTemplateContainer
MyVi.Client.Controls.LayoutTemplateContainer = function(data) 
{
    MyVi.Client.Controls.LayoutTemplateContainer.initializeBase(this, [data]);
}
MyVi.Client.Controls.LayoutTemplateContainer.prototype =
{
    PlaceHolderID: "#itemPlaceHolder",
    LayoutElement: undefined,
    ToAppend: false,
    ToPrepend: false,
//    RenderTemplate: function(place_holder) 
//    {
//        if (this.LayoutElement != undefined) 
//        {
//            var templateElement = jQuery(this.LayoutElement);
//            var cloneElement = templateElement.clone();
//            if (!this.ToAppend)
//            {
//            	cloneElement.removeAttr("id");
//            	cloneElement.attr("id", place_holder.attr("id"));
//            	jQuery(place_holder).replaceWith(cloneElement);
//            }
//            else
//            	jQuery(place_holder).append(cloneElement.children());
//				
//        }
//    }
    RenderTemplate: function(place_holder) {
        if (this.LayoutElement != undefined) {
            var templateElement = jQuery(this.LayoutElement);
            var cloneElement = templateElement.clone();
            if (!this.ToAppend && !this.ToPrepend) {
                cloneElement.removeAttr("id");
                cloneElement.attr("id", place_holder.attr("id"));
                jQuery(place_holder).replaceWith(cloneElement);
            } else if (this.ToAppend)
                jQuery(place_holder).append(cloneElement.children());
            else jQuery(place_holder).prepend(cloneElement.children());
        }
    }
}
MyVi.Client.Controls.LayoutTemplateContainer.registerClass("MyVi.Client.Controls.LayoutTemplateContainer", MyVi.Client.Controls.BaseControl);


//GroupTemplateContainer
MyVi.Client.Controls.GroupTemplateContainer = function(data) 
{
    MyVi.Client.Controls.GroupTemplateContainer.initializeBase(this, [data]);
}
MyVi.Client.Controls.GroupTemplateContainer.prototype =
{
    PlaceHolderID: "#groupPlaceHolder",
    LayoutElement: undefined,
    RenderTemplate: function(place_holder_group, data, item_template, place_holder_item, item_separator, is_render_separator) 
    {
        if (this.LayoutElement != undefined && data!=null)
        {
            var templateElement = jQuery(this.LayoutElement);
            var cloneElement = templateElement.clone();
            cloneElement.removeAttr("id");
            jQuery(place_holder_group).before(cloneElement);
            item_template.RenderTemplate(place_holder_item, false, data);
            if (item_separator != null && is_render_separator)
            {
                templateElement = jQuery(item_separator.Templates[0].LayoutElement);
                cloneElement = templateElement.clone();
                cloneElement.removeAttr("id");
                jQuery(place_holder_group).before(cloneElement);
            }
            jQuery(place_holder_item).remove();
        } 
    }
}
MyVi.Client.Controls.GroupTemplateContainer.registerClass("MyVi.Client.Controls.GroupTemplateContainer", MyVi.Client.Controls.BaseControl);;
///<reference path="~/_common/main.js" />
///<reference path="~/_common/Controls.js" />

Type.registerNamespace("MyVi.Client.Controls.Data");

//JSONDataSource class
MyVi.Client.Controls.Data.JSONDataSource = function (data)
{
	this.ServiceUrl = "";
	MyVi.Client.Controls.Data.JSONDataSource.initializeBase(this,[data]);
}
MyVi.Client.Controls.Data.JSONDataSource.prototype =
{
    DirectJson: null,
    ServiceUrl: null,
    Jsonp: false,
    _ExecuteSelect: function(return_value, callback) {
        if (this.DirectJson != null && this.DirectJson != "") {
            return_value._data = this.DirectJson;
            this.DirectJson = null;
            callback(return_value);
            jQuery("#processing").hide();
            jQuery("#content").show();
        } else if (this.ServiceUrl != null && this.ServiceUrl != "") {
            var serviceUrl = MyVi.Client.Controls.BaseDataSource.GetRequestURL(this.ServiceUrl, this.Parameters);
            if (this.Jsonp) serviceUrl += "&jsoncallback=?";

            jQuery("#processing").ajaxStart(function() {
                jQuery(this).show();
                jQuery("#content").hide();
            });
            jQuery.getJSON(serviceUrl, function(data) {
                return_value._data = data;
                callback(return_value);
            });
            jQuery().ajaxStop(function() {
                jQuery("#processing").hide();
                jQuery("#content").show();
            });
        }
    }
}
MyVi.Client.Controls.Data.JSONDataSource.registerClass("MyVi.Client.Controls.Data.JSONDataSource", MyVi.Client.Controls.BaseDataSource);

// ObjectDataSource class
MyVi.Client.Controls.Data.ObjectDataSource = function(data) {
    MyVi.Client.Controls.Data.ObjectDataSource.initializeBase(this, [data]);
    if (data.ServiceMethod instanceof Function)
        this.ServiceMethod = data.ServiceMethod;

}
MyVi.Client.Controls.Data.ObjectDataSource.prototype =
{
    StartJson: null,
    ServiceMethod: null,
    _ExecuteSelect: function(return_value, callback) {
        var target = this;

        if (!target.StartJson) {
            this.ServiceMethod(this.Parameters,
		        function(val) {
		            return_value._data = val;
		            callback(return_value);
		        },
		        function(val) {
		            return_value._data = val;
		            callback(return_value);
		        });
	    } else {
	        return_value._data = target.StartJson;
	        target.StartJson = null;
	        callback(return_value);
        }
    }
}
MyVi.Client.Controls.Data.ObjectDataSource.registerClass("MyVi.Client.Controls.Data.ObjectDataSource", MyVi.Client.Controls.BaseDataSource);


//DataView class
MyVi.Client.Controls.Data.DataView = function (data)
{
	MyVi.Client.Controls.Data.DataView.initializeBase(this,[data]);
	
}
MyVi.Client.Controls.Data.DataView.prototype = 
{
	GetGoPageUrl:function(page_num, base_url)
	{
		var queryParams = MyVi.Client.Utils.ParseQueryString(base_url);
		this.SetQueryParams(queryParams);
		this.SetQueryParam(queryParams, "pn", page_num);
		return MyVi.Client.Utils.CreateQueryString(queryParams, base_url);
	},
	GetGoPageEventHandler:function(page_num)
	{
		var target = this;
		return function(e)
		{
			target.Paging.PageNum = page_num;
			target.ChangeData();
		};	
	}
}
MyVi.Client.Controls.Data.DataView.registerClass("MyVi.Client.Controls.Data.DataView", MyVi.Client.Controls.BaseDataView);
;
///<reference path="~/_common/main.js" />
///<reference path="~/_common/Controls.js" />

Type.registerNamespace("MyVi.Client.Controls.UI");

//ListView class
MyVi.Client.Controls.UI.ListView = function (data)
{
	MyVi.Client.Controls.UI.ListView.initializeBase(this, [data]);
	if(this.LayoutTemplate!=null)
	    //this.LayoutTemplate = new MyVi.Client.Controls.TemplateListContainer(this.LayoutTemplate);
	    this.LayoutTemplate = new MyVi.Client.Controls.LayoutTemplateContainer(this.LayoutTemplate);
	if(this.GroupTemplate != null)
	    this.GroupTemplate = new MyVi.Client.Controls.GroupTemplateContainer(this.GroupTemplate);
	if(this.ItemTemplate!=null)
		this.ItemTemplate = new MyVi.Client.Controls.TemplateListContainer(this.ItemTemplate);
	if(this.ItemSeparatorTemplate!=null)
		this.ItemSeparatorTemplate = new MyVi.Client.Controls.TemplateListContainer(this.ItemSeparatorTemplate);
	if(this.EmptyTemplate!=null)
		this.EmptyTemplate = new MyVi.Client.Controls.TemplateListContainer(this.EmptyTemplate);
	if(this.ErrorTemplate!=null)
		this.ErrorTemplate = new MyVi.Client.Controls.TemplateListContainer(this.ErrorTemplate);
}

MyVi.Client.Controls.UI.ListView.prototype =
{
    //GroupPlaceHolder: "#groupPlaceHolder",
    //ItemPlaceHolder: "#itemPlaceHolder",
    LayoutTemplate: null,
    GroupTemplate: null,
    GroupItemsCount: null,
    ItemTemplate: null,
    EmptyTemplate: null,
    ErrorTemplate: null,
    ItemSeparatorTemplate: undefined,
    OnCreateChildControlComplete: undefined,
    CreateChildControl: function() {
        //this.ClearChildControls();
        var placeHolder = jQuery(this.Id);

        if (this._errorData != null) {
            if (this.ErrorTemplate != null)
                this.ErrorTemplate.RenderTemplate(placeHolder, true, [this._errorData]);
        }
        else if (this.ItemsData != null && this.ItemsData.length > 0) {
            if (this.LayoutTemplate != null) {
                //this.LayoutTemplate.RenderTemplate(placeHolder,true,this.LayoutData!=null?this.LayoutData:[""]);

                this.LayoutTemplate.RenderTemplate(placeHolder);

                if (this.GroupTemplate != null && this.ItemTemplate != null) {
                    //var groupPlaceHolder = this.Id + " #groupPlaceHolder";
                    //var itemPlaceHolder = this.Id + " #itemPlaceHolder";

                    var groupPlaceHolder = this.Id + " " + this.GroupTemplate.PlaceHolderID;
                    var itemPlaceHolder = this.Id + " " + this.LayoutTemplate.PlaceHolderID;

                    //var groupPlaceHolder = this.Id + " " + this.GroupPlaceHolder;
                    //var itemPlaceHolder = this.Id + " " + this.ItemPlaceHolder;

                    var itemsData = new Array();

                    var groupCnt = Math.ceil(this.ItemsData.length / this.GroupItemsCount);
                    for (var i = 0; i < groupCnt; i++) {
                        for (var j = 0; j < this.GroupItemsCount; j++) {
                            itemsData[j] = this.ItemsData[i * this.GroupItemsCount + j];
                        }
                        var is_render_separator = i < (groupCnt - 1);
                        this.GroupTemplate.RenderTemplate(groupPlaceHolder, itemsData, this.ItemTemplate, itemPlaceHolder, this.ItemSeparatorTemplate, is_render_separator);
                    }
                    jQuery(groupPlaceHolder).remove();
                }
                else if (this.ItemTemplate != null) {
                    //var itemPlaceHolder = this.Id + " " + this.ItemPlaceHolder;
                    var itemPlaceHolder = this.Id + " " + this.LayoutTemplate.PlaceHolderID;
                    if (this.ItemTemplate != null)
                        this.ItemTemplate.RenderTemplate(itemPlaceHolder, false, this.ItemsData, this.ItemSeparatorTemplate);
                    jQuery(itemPlaceHolder).remove();
                }
            }
        }
        else {
            if (this.EmptyTemplate != null)
                this.EmptyTemplate.RenderTemplate(placeHolder, true, [""]);
        }
        if (this.OnCreateChildControlComplete)
            this.OnCreateChildControlComplete();
    }
}
MyVi.Client.Controls.UI.ListView.registerClass("MyVi.Client.Controls.UI.ListView", MyVi.Client.Controls.BaseDataBoundControl);


//DataPaging class
MyVi.Client.Controls.UI.DataPaging = function (data)
{
	MyVi.Client.Controls.UI.DataPaging.initializeBase(this, [data]);
	if(this.LayoutTemplate!=null)
		this.LayoutTemplate = new MyVi.Client.Controls.TemplateListContainer(this.LayoutTemplate);
	if(this.ItemTemplate!=null)
		this.ItemTemplate = new MyVi.Client.Controls.TemplateListContainer(this.ItemTemplate);
	if(this.ItemSelectedTemplate!=null)
		this.ItemSelectedTemplate = new MyVi.Client.Controls.TemplateListContainer(this.ItemSelectedTemplate);
	if(this.ItemSeparatorTemplate!=null)
		this.ItemSeparatorTemplate = new MyVi.Client.Controls.TemplateListContainer(this.ItemSeparatorTemplate);
	if(this.EmptyTemplate!=null)
		this.EmptyTemplate = new MyVi.Client.Controls.TemplateListContainer(this.EmptyTemplate);
}

MyVi.Client.Controls.UI.DataPaging.prototype =
{
    //ItemPlaceHolder:"#itemPlaceHolder",
	LeftPages:3, RightPages:3,
	DataView:undefined,
	LayoutTemplate:null,
	ItemTemplate:null,
	ItemSelectedTemplate:null,
	ItemSeparateTemplate: undefined,
	OnCreateChildControlComplete : undefined,
	EmptyTemplate:null,
	CreateChildControl:function()
	{
		this.ClearChildControls();
		var placeHolder = jQuery(this.Id);
		
		if(this._errorData!=null)
		{
		}
		else if (this.ItemsData != null && this.ItemsData.total > this.ItemsData.size)
		{
			if(this.LayoutTemplate!=null)
			{
				var data = this._GenerateData(this.ItemsData);
				this.LayoutTemplate.RenderTemplate(placeHolder,true,data.layoutData);
				//var itemPlaceHolder = this.Id + " " + this.ItemPlaceHolder;
				var itemPlaceHolder = this.Id + " " + this.LayoutTemplate.PlaceHolderID;
				if(this.ItemTemplate!=null)
				{
					this.ItemTemplate.RenderTemplate(itemPlaceHolder,false,data.beforeData,this.ItemSeparatorTemplate);
					if(data.selectedData && this.ItemSelectedTemplate!=null)
					{
						if(data.beforeData.length > 0 && this.ItemSeparatorTemplate) this.ItemSeparatorTemplate.RenderTemplate(itemPlaceHolder,false,[""]);
						this.ItemSelectedTemplate.RenderTemplate(itemPlaceHolder,false,data.selectedData,this.ItemSeparatorTemplate);
						if(data.afterData.length > 0 && this.ItemSeparatorTemplate) this.ItemSeparatorTemplate.RenderTemplate(itemPlaceHolder,false,[""]);
					}
					this.ItemTemplate.RenderTemplate(itemPlaceHolder,false,data.afterData,this.ItemSeparatorTemplate);
				}
				jQuery(itemPlaceHolder).remove();
			}
		}
		else
		{
			if(this.EmptyTemplate!=null)
				this.EmptyTemplate.RenderTemplate(placeHolder,true,[""]);
        }
        if (this.OnCreateChildControlComplete)
            this.OnCreateChildControlComplete();

	},
	_GenerateData:function(paging)
	{
		var rval = {layoutData:undefined, beforeData:[], selectedData:undefined, afterData:[]};
		var i;
		var selectedIndex = paging.num;
		var lastPageNum = (paging.total / paging.size) + 1;
		var startIndex = selectedIndex - this.LeftPages;
		
		var endIndex = selectedIndex + this.RightPages + 1;
		if(endIndex>lastPageNum)
		{
			endIndex = Math.ceil(lastPageNum);
			startIndex = endIndex - this.LeftPages - this.RightPages -1;
		}
		if(startIndex < -this.LeftPages ) startIndex = -this.LeftPages;
		
		
		for(i=startIndex;i<selectedIndex && i<lastPageNum;i++)
		{
			if(i>0) rval.beforeData.push(this._GenerateItem(i,paging));
			else endIndex++;
		}
		if(i<lastPageNum) rval.selectedData = this._GenerateItem(i,true);
		for(i=selectedIndex+1;i<endIndex && i < lastPageNum;i++)
		{
			if(i>0) rval.afterData.push(this._GenerateItem(i,paging));
		}
		
		rval.layoutData = this._GenerateItem(0,paging);
		
		return rval;
	},
	_GenerateItem:function(page_num, paging)
	{
		var rval;
		var dataView = this.GetObject(this.DataView);
		if(!Object.getType(dataView).inheritsFrom(MyVi.Client.Controls.BaseDataView))
			throw "DataPaging.DataView required MyVi.Client.Controls.BaseDataView type";
		
		if(page_num>0)
		{
			rval = {text:page_num.toString(), pageNum:page_num, url:undefined, 
				gopageEventHandler:undefined};
			
			if (dataView.QueryStringField)
				rval.url = dataView.GetGoPageUrl(page_num);
			else
				rval.gopageEventHandler = dataView.GetGoPageEventHandler(page_num);
		}
		else
		{
			rval = {prevpageEnabled:paging.num>1,nextpageEnabled:(paging.total / paging.size)>paging.num,
				prevpageUrl:undefined, nextpageUrl:undefined,
				prevpageHandler:undefined, nextpageHandler:undefined};
			
			if (dataView.QueryStringField)
			{
				rval.prevpageUrl = dataView.GetGoPageUrl(paging.num-1);
				rval.nextpageUrl = dataView.GetGoPageUrl(paging.num+1);
			}
			else
			{
				rval.prevpageHandler = dataView.GetGoPageEventHandler(paging.num-1);
				rval.nextpageHandler = dataView.GetGoPageEventHandler(paging.num+1);
			}
		}
		
		return rval;
	}

}
MyVi.Client.Controls.UI.DataPaging.registerClass("MyVi.Client.Controls.UI.DataPaging", MyVi.Client.Controls.BaseDataBoundControl);
