/*  $Id: jmultiply.js 3461 2007-03-01 03:07:47Z fpaz $ */
/*  Configuration settings for multiple element creation
    var options = {
        element        :   ".table-source",
        trigAdd        :   "#add",
        trigRem        :   "#remove",
        hasChild       :   true,
        limit          :   5,
        childSetting   :
        {
            element     :   ".childContainer",
            before      :   ".ctrlContainer",
            trigAdd     :   ".addRow",
            trigRem     :   ".remRow",
            limit       :   5
        }
    }
    $("#parent").multiply(options);  
*/
var globalSettings = new Array();
jQuery.fn.domCreate = function(settings)
{
    var guid = 0;
    if(settings.limit > jQuery(settings.element,this).size()){
        if(typeof(jQuery(settings.element+":last").attr('guid')) =='undefined'){
            jQuery(settings.element).attr('guid',0);
        }else{
            guid = Number(jQuery(settings.element+":last").attr('guid'));
        }
        cloneOBJ = settings.def.clone();

        if(typeof(settings.isChild) =='undefined'){
            cloneOBJ.attr('guid',++guid);
        }
        setGuid(cloneOBJ,guid,true); 
        
        if(settings.before){
            jQuery(settings.before).before(cloneOBJ);
        }else{
            this.append(cloneOBJ);    
        }
        
        if(typeof(settings.afterCreate) =='function'){
            var fnc = settings.afterCreate;
            fnc();
        }
        if(settings.childSetting){
            cloneOBJ.multiply(setChildConfig(settings.childSetting,guid));
        }
    }    
}

setGuid = function(obj,guid,clear){
    jQuery('a,div,tr,input',obj).each(function(){
        jQuery(this).attr('guid',guid);
        if(this.tagName.toLowerCase() == 'input'){
            nameEl = this.name;
            nameEl = stripSelector(nameEl);
            _name = Number(nameEl.substr(nameEl.length-1,nameEl.length));
                           
            if(!isNaN(_name)){
                nameEl = nameEl.substr(0,nameEl.length-1) + _name + '[]';
            }else{
                nameEl = nameEl + guid + '[]';
            }   
            if(this.className && this.className.indexOf('ignore') != -1){
                // do nothing
            }else{
                this.name = nameEl;
            }    
            
            if(this.type == 'text' && clear){
                this.value ="";      
            }
        }
    });           
}

stripSelector = function(prop){
    if(prop.indexOf('[') != -1){
        return prop.substr(0,prop.lastIndexOf("["));
    }else{
        return prop;
    }
}

setChildConfig = function(options,guid){
    var childOptions = {
        element : stripSelector(options.element) + "[@guid="+guid+"]",
        before  : stripSelector(options.before)  + "[@guid="+guid+"]",
        trigAdd : stripSelector(options.trigAdd) + "[@guid="+guid+"]",
        trigRem : stripSelector(options.trigRem) + "[@guid="+guid+"]",
        afterCreate: options.afterCreate,
        afterRemove: options.afterRemove,
        isChild : true,
        limit   : options.limit
    };         
    return childOptions;
}

jQuery.fn.domRemove = function(param)
{
    if(jQuery(param.element).size()>1){
        jQuery(param.element +":last").remove();
		if(typeof(param.afterRemove) =='function'){
            var fnc = param.afterRemove;
            fnc();
        }
    }    
}

jQuery.fn.multiply = function(settings)
{
    return this.each(function(){
        var container = this;
        var options   = {};
        var guid      = 0;
    
        if(settings){
            options = jQuery.extend(settings,{
                parent  :   container,
                def     :   jQuery(settings.element).clone()
            });   
        }

        if(options.isChild){
            globalSettings.push(options);
        }

        if(options.childSetting && typeof(jQuery(settings.element).attr('guid')) =='undefined'){
            jQuery(settings.element).attr('guid',0);
//            setGuid(jQuery(settings.childSetting.element).get(),guid,false);
        }else{
        	
            guid = jQuery(this).attr('guid');
            if(typeof(guid) =='undefined'){
            	guid=0;
            }
        }
		
        setGuid(jQuery(settings.element),guid,false);
        jQuery(options.trigAdd).click(function(){
            uid = jQuery(this).attr('guid');
            if(typeof(uid) !='undefined'){
                gSettings = globalSettings[Number(uid)];
                jQuery(gSettings.parent).domCreate(gSettings);
            }else{                
                jQuery(container).domCreate(options);
            }
        });
        
        jQuery(options.trigRem).click(function(){
            jQuery(container).domRemove(options);
        });
        
        if(options.childSetting && options.childSetting.element != options.element){
            jQuery(options.element+"[@guid=0]").multiply(setChildConfig(options.childSetting,0));
        } 
   })
}
