﻿(function($){
    $.fn.DataBind = function(options){
        var opts = $.extend({}, $.fn.DataBind.defaults, options);
        
        return this.each(function(){
            var $this = $(this);
            var intIndex;
            var strHTML = '';
            
            var o = $.meta ? $.extend({}, opts, $this.data()):opts;
            if(o.Data != null){
                if(typeof o.Data.length == 'undefined'){
                    if(typeof o.OnBind == "function"){
                        o.OnBind(o.Data);
                    }
                    strHTML = BindData(o.Data, o.BindItem, o.ClearContent, $(this));
                }else{
                    for(intIndex = 0; intIndex <= o.Data.length-1; intIndex++){
                        if(typeof o.OnBind == "function"){
                            o.OnBind(o.Data[intIndex]);
                        }
                        
                        if(o.Data[intIndex].constructor.toString().indexOf("Object") > -1){
                            strHTML += BindData(o.Data[intIndex], o.BindItem, o.ClearContent, $(this));
                        }else{
                            strHTML += BindArrayData(o.Data[intIndex], o.BindItem, o.ClearContent, $(this));
                        }
                    }
                }
                $this.append(strHTML);
            }
        });
    };
    
    $.fn.DataBind.defaults = {
        Data:null,
        BindItem:'',
        ClearContent:false,
        OnBind:null
    };
    
    function BindData(objData, objBindItem, blnClearContent, objDoc){
            var x;
            var strHTML = objBindItem;
            var strRegEx;
            
            if(blnClearContent){
                objDoc.children().remove();
            }
            
            for(x in objData){
                var objRegEx = new RegExp();
                
                //Find all items in the string that have the property, not case sensitive.
                objRegEx.compile('{' + x + '}', 'g');
                
                strHTML = strHTML.replace(objRegEx, objData[x]);
            }
            
            return strHTML;
        };
        
        
        function BindArrayData(objData, objBindItem, blnClearContent, objDoc){
            var strHTML = objBindItem;
            
            if(blnClearContent){
                objDoc.children().remove();
            }
            
            strHTML = strHTML.replace(/\{\}/g,objData);
            
            return strHTML;
        };
})(jQuery);
