/*------------------------------------------------------------------------*/
/*                         CORE JS LIBRARY
/*------------------------------------------------------------------------*/
// Connection info
var protocol = document.location.protocol;
var port = document.location.port;
if(showDbug) dbug.log("Conn Info: %s - %s",protocol,port);

var Box;
window.addEvent(
    'domready', function() {
        Box = new MultiBox({
            'loaderImg': '/images/general/loader.gif'
        });
    }
);


/*------------------------------------------------------------------------*/
/*                AUTHENTICATION RELATED FUNCTIONS
/*------------------------------------------------------------------------*/
var logout = function() {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'a' : '16'
    });

    var myOptions = new Hash({
        'requestName': 'logout',
        'url': 'action.cgi',
        'onComplete': 'logoutPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var logoutPost = function(responseJSON) {
    Box.LoaderControl('hide');
    if(responseJSON.status == 100)
    {
        Cookie.dispose('ovh.biz', { domain : '.ovh.biz'} );
        Cookie.dispose('ovh.biz-nic', { domain : '.ovh.biz'} );
    }

    Box.NotifierControl('show',responseJSON);
    
    if(responseJSON.status == 100)
    {
        redirect(protocol+'//www.ovh.biz:'+port+'/',3000);
    }
};


/*------------------------------------------------------------------------*/
/*                  USER RELATED FUNCTIONS
/*------------------------------------------------------------------------*/
var addUser = function() {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'nicHandle' : $('nicHandle').getProperty('value').clean(),
        'nickName'  : $('nickName').getProperty('value').clean(),
        'firstName' : $('firstName').getProperty('value').clean(),
        'lastName'  : $('lastName').getProperty('value').clean(),
        'country'   : $('country').getProperty('value').clean(),
        'language'  : $('language').getProperty('value').clean(),
        'city'      : $('city').getProperty('value').clean(),
        'zipCode'   : $('zipCode').getProperty('value').clean(),
        'phone'     : $('phone').getProperty('value').clean(),
        'email'     : $('email').getProperty('value').clean(),
        'status'    : $('status').getProperty('value').clean(),
        'a': '1'
    });

    var myOptions = new Hash({
        'requestName': 'addUser',
        'url': 'action.cgi',
        'onComplete': 'addUserPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var addUserPost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
    
    if(responseJSON.status == 100)
    {
        var myCookie = Cookie.write('ovh.biz', responseJSON.value.cookie, { domain: '.ovh.biz'});
        redirect(protocol+'//www.ovh.biz:'+port+'/',3000);
    }
};

var saveUserData = function() {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idUser'      : $('idUser').getProperty('value').clean(),
        'nicHandle'   : $('userNicHandle').getProperty('value').clean(),
        'nickName'    : $('userNickName').getProperty('value').clean(),
        'firstName'   : $('userFirstName').getProperty('value').clean(),
        'lastName'    : $('userLastName').getProperty('value').clean(),
        'country'     : $('userCountry').getProperty('value').clean(),
        'language'    : $('userLanguage').getProperty('value').clean(),
        'city'        : $('userCity').getProperty('value').clean(),
        'zipCode'     : $('userZipCode').getProperty('value').clean(),
        'email'       : $('userEmail').getProperty('value').clean(),
        'phone'       : $('userPhone').getProperty('value').clean(),
        'description' : $('userDescription').getProperty('value'),
        'status'      : $('userStatus').getProperty('value').clean(),
        //'password'  : $('password').getProperty('value').clean(),
        'a': '22'
    });

    var myOptions = new Hash({
        'requestName': 'saveUserData',
        'url': 'action.cgi',
        'onComplete': 'saveUserDataPost',
        'concurrentRequest': 0
    });

    $('userPassword').setProperty('value','');

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var saveUserDataPost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
};

var addUserReference = function() {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idUser' : $('idUser').getProperty('value').clean(),
        'type'   : $('userReferenceType').getProperty('value').clean(),
        'name'   : $('userReferenceName').getProperty('value').clean(),
        'url'    : $('userReferenceUrl').getProperty('value').clean(),
        'target' : $('userReferenceTarget').getProperty('value').clean(),
        'a': '31'
    });

    var myOptions = new Hash({
        'requestName': 'addUserReference',
        'url': 'action.cgi',
        'onComplete': 'addUserReferencePost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var addUserReferencePost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
    
    if( responseJSON.status == 100)
    {
        items = [
            [globalScope,'mainFull'],
        ];

        loadContent({
            'items': items
        });
    }
};

var deleteUserReference = function(id) {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idReference' : id,
        'a': '32'
    });

    var myOptions = new Hash({
        'requestName': 'deleteUserReference',
        'url': 'action.cgi',
        'onComplete': 'deleteUserReferencePost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var deleteUserReferencePost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
    
    if( responseJSON.status == 100)
    {
        items = [
            [globalScope,'mainFull'],
        ];

        loadContent({
            'items': items
        });
    }
};

var saveUserOvhMag = function() {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idUser' : $('idUser').getProperty('value').clean(),
        'ovhMag' : $('userOvhMag').getProperty('value'),
        'a': '33'
    });

    var myOptions = new Hash({
        'requestName': 'saveUserOvhMag',
        'url': 'action.cgi',
        'onComplete': 'saveUserOvhMagPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var saveUserOvhMagPost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
};

var saveUserPreferences = function() {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idUser'        : $('idUser').getProperty('value').clean(),
        'avatar'        : $('userAvatar').getProperty('value').clean(),
        'enableBlog'    : $('userEnableBlog').getProperty('checked'),
        'enableForum'   : $('userEnableForum').getProperty('checked'),
        'enableScript'  : $('userEnableScript').getProperty('checked'),
        'enableHowto'   : $('userEnableHowto').getProperty('checked'),
        'enablePoc'     : $('userEnablePoc').getProperty('checked'),
        'showAddress'   : $('userShowAddress').getProperty('checked'),
        'showEmail'     : $('userShowEmail').getProperty('checked'),
        'showPhone'     : $('userShowPhone').getProperty('checked'),
        'showServices'  : $('userShowServices').getProperty('value').clean(),
        'a': '21'
    });

    var myOptions = new Hash({
        'requestName': 'saveUserPreferences',
        'url': 'action.cgi',
        'onComplete': 'saveUserPreferencesPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var saveUserPreferencesPost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
};

var saveUserCompetences = function(HierCheck) {
    Box.LoaderControl('show');
    HierCheck.GetSelected(HierCheck.competences);

    var selectedString = '';
    HierCheck.selected.each( function(value,key) {
        selectedString += key+'-';
    });

    var myParams = new Hash({
        'idUser'        : $('idUser').getProperty('value').clean(),
        'competenceIds' : selectedString,
        'a': '20' 
    });
    
    var myOptions = new Hash({
        'requestName': 'saveUserCompetence',
        'url': 'action.cgi',
        'onComplete': 'saveUserCompetencePost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var saveUserCompetencePost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
};

/*------------------------------------------------------------------------*/
/*                  GROUP RELATED FUNCTIONS
/*------------------------------------------------------------------------*/
saveGroupData = function() {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idGroup'     : $('idGroup').getProperty('value').clean(),
        'name'        : $('groupName').getProperty('value').clean(),
        'description' : $('groupDescription').getProperty('value'),
        'a': '23'
    });

    var myOptions = new Hash({
        'requestName': 'saveGroupData',
        'url': 'action.cgi',
        'onComplete': 'saveGroupDataPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var saveGroupDataPost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
    
    loadContent({
        'items': [
            [globalScope,'mainLeft',$('idGroup').getProperty('value').clean()],
        ]
    });
}

saveGroupPreference = function() {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idGroup' : $('idGroup').getProperty('value').clean(),
        'public'  : $('groupPublic').getProperty('checked'),
        'a': '24'
    });

    var myOptions = new Hash({
        'requestName': 'saveGroupPreference',
        'url': 'action.cgi',
        'onComplete': 'saveGroupPreferencePost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var saveGroupPreferencePost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
}

function addGroup() {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idUser'      : $('idUser').getProperty('value').clean(),
        'name'        : $('name').getProperty('value').clean(),
        'description' : $('description').getProperty('value').clean(),
        'a': '3'
    });

    var myOptions = new Hash({
        'requestName': 'addGroup',
        'url': 'action.cgi',
        'onComplete': 'addGroupPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var addGroupPost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);

    if(responseJSON.status == 100)
    {
        redirect(protocol+'//'+responseJSON.value.nickName+'.ovh.biz:'+port+'/group.cgi?g='+responseJSON.value.id,3000);
    }
}

function deleteGroup(idGroup) {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idGroup' : idGroup,
        'a': 19 
    });

    var myOptions = new Hash({
        'requestName': 'delGroup',
        'url': 'action.cgi',
        'onComplete': 'deleteGroupPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var deleteGroupPost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);

    if(responseJSON.status == 100)
    {
        items = [
            [globalScope,'mainFull'],
        ];

        loadContent({
            'items': items
        });

        $('mainEmpty').setStyle('display','none');
        $('mainEmpty').set('html','');
    }
}

/*------------------------------------------------------------------------*/
/*                    MEMBERSHIP RELATED FUNCTIONS
/*------------------------------------------------------------------------*/
function sendMembershipAction(u,g,a) {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'u' : u,
        'g' : g,
        'a' : a
    });

    var myOptions = new Hash({
        'requestName': 'MembershipAction',
        'url': 'action.cgi',
        'onComplete': 'membershipActionPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};

function sendInvitation(g,a) {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'u' : $('groupInvitedUserNickName').getProperty('value').clean(),
        'g' : g,
        'a' : a
    });


    var myOptions = new Hash({
        'requestName': 'MembershipAction',
        'url': 'action.cgi',
        'onComplete': 'membershipActionPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};

var sendSubscription = function(u,a) {
    Box.LoaderControl('show');

    var myParams = new Hash({
            'g' : $('userSubscribedGroupName').getProperty('value').clean(),
            'u' : u,
            'a' : a
        });

    var myOptions = new Hash({
        'requestName': 'MembershipAction',
        'url': 'action.cgi',
        'onComplete': 'membershipActionPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};

var membershipActionPost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
   
    if(responseJSON.status == 100 )
    {
        var items = [];

        if($('mainEmpty').getStyle('display') == 'block' )
        {
            items = [
                [globalScope,'mainEmpty',$('idGroup').getProperty('value').clean()],
            ];
        }
        else
        {
            items = [
                [globalScope,'mainFull'],
            ];
        }

        loadContent({
            'items': items
        });
    }
};

/*------------------------------------------------------------------------*/
/*                     FORUM RELATED FUNCTIONS
/*------------------------------------------------------------------------*/
var addForumLink = function() {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idUser'    : $('idUser').getProperty('value').clean(),
        'idForum'   : $('idForum').getProperty('value').clean(),
        'username'  : $('username').getProperty('value').clean(),
        'password'  : $('password').getProperty('value').clean(),
        'a' : '17'
    });

    var myOptions = new Hash({
        'requestName': 'ForumshipAction',
        'url': 'action.cgi',
        'onComplete': 'addForumLinkPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var addForumLinkPost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);

    loadContent({
        'items': [
            [globalScope,'mainLeft'],
        ]
    });
}

var delForumLink = function(u,f) {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idUser'    : u,
        'idForum'   : f,
        'a' : '18'
    });

    var myOptions = new Hash({
        'requestName': 'ForumshipAction',
        'url': 'action.cgi',
        'onComplete': 'delForumLinkPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var delForumLinkPost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
    
    loadContent({
        'items': [
            [globalScope,'mainLeft'],
        ]
    });
}

var showForumPost = function(id) {
    var url = $(id).getProperty('value').clean();
    window.open(url);
}

/*------------------------------------------------------------------------*/
/*                     POC RELATED FUNCTIONS
/*------------------------------------------------------------------------*/
var pocSubscribe = function(u,p) {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idUser' : u,
        'idPoc'  : p,
        'a' : '25'
    });

    var myOptions = new Hash({
        'requestName': 'PocSubscribe',
        'url': 'action.cgi',
        'onComplete': 'pocSubscribePost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var pocSubscribePost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);

    loadContent({
        'items': [
            [globalScope,'mainLeft'],
        ]
    });
}

var pocUnsubscribe = function(u,p) {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idUser' : u,
        'idPoc'  : p,
        'a' : '26'
    });

    var myOptions = new Hash({
        'requestName': 'PocUnsubscribe',
        'url': 'action.cgi',
        'onComplete': 'pocUnsubscribePost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var pocUnsubscribePost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);

    loadContent({
        'items': [
            [globalScope,'mainLeft'],
        ]
    });
}

/*------------------------------------------------------------------------*/
/*                     SEARCH RELATED FUNCTIONS
/*------------------------------------------------------------------------*/
var initCompetenceSelect = function() {
    $('competences').getSelected().each(function(el) { 
        el.selected = false;
    });
}

var searchItem = function() {
    Box.LoaderControl('show');

    var selectedString = '';
    $('competences').getSelected().each( function(el) {
        selectedString += $(el).getProperty('value').clean()+'-';
    });

    var myParams = new Hash({
        'q' : $('q').getProperty('value').clean(),
        't' : $('t').getProperty('value').clean(),
        'c' : selectedString,
        'a' : '27'
    });

    dbug.log('%o',myParams);

    var myOptions = new Hash({
        'requestName': 'search',
        'url': 'action.cgi',
        'onComplete': 'searchItemPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
}
var searchItemPost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);

    loadContent({
        'items': [
            [globalScope,'mainLeft',responseJSON.value],
        ]
    });
}

/*------------------------------------------------------------------------*/
/*                    Call For Bid RELATED FUNCTIONS
/*------------------------------------------------------------------------*/
var addEstimate = function() {
    Box.LoaderControl('show');

    var myParams = new Hash({
        'idUser'        : $('idUser').getProperty('value').clean(),
        'idCallForBid'  : $('idCallForBid').getProperty('value').clean(),
        'cost'          : $('cost').getProperty('value').clean(),
        'duration'      : $('durationValue').getProperty('value').clean()+$('durationUnit').getProperty('value').clean(),
        'description'   : $('description').getProperty('value').clean(),
        'a': '30'
    });

    var myOptions = new Hash({
        'requestName': 'addEstimate',
        'url': 'action.cgi',
        'onComplete': 'addEstimatePost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var addEstimatePost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
    
    if(responseJSON.status == 100)
    {
        redirect('cfb.cgi',3000);
    }
};

var addCallForBid = function(HierCheck) {
    Box.LoaderControl('show');
    HierCheck.GetSelected(HierCheck.competences);

    var selectedString = '';
    HierCheck.selected.each( function(value,key) {
        selectedString += key+'-';
    });

    var myParams = new Hash({
        'idUser'        : $('idUser').getProperty('value').clean(),
        'subject'       : $('subject').getProperty('value').clean(),
        'budgetMin'     : $('budgetMin').getProperty('value').clean(),
        'budgetMax'     : $('budgetMax').getProperty('value').clean(),
        'currency'      : $('currency').getProperty('value').clean(),
        'dateLimit'     : $('dateLimit').getProperty('value').clean(),
        'description'   : $('description').getProperty('value').clean(),
        'competenceIds' : selectedString,
        'a': '28'
    });

    var myOptions = new Hash({
        'requestName': 'addCallForBid',
        'url': 'action.cgi',
        'onComplete': 'addCallForBidPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var addCallForBidPost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
    
    if(responseJSON.status == 100)
    {
        redirect('cfb.cgi',3000);
    }
};

var chooseCallForBidEstimate = function(idCallForBid,idEstimate) {
    Box.LoaderControl('show');
    
    var myParams = new Hash({
        'idCallForBid'  : idCallForBid,
        'idEstimate'    : idEstimate,
        'a': '29'
    });

    var myOptions = new Hash({
        'requestName': 'chooseCallForBidEstimate',
        'url': 'action.cgi',
        'onComplete': 'chooseCallForBidEstimatePost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};
var chooseCallForBidEstimatePost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
    
    if(responseJSON.status == 100)
    {
        loadContent({
            'items': [
                [globalScope,'mainLeft'],
                [globalScope,'mainRight',responseJSON.value],
            ]
        });
    }
};

var displayCallForBidEstimates = function(idCallForBid) {
    loadContent({
        'items': [
            [globalScope,'mainRight',idCallForBid],
        ]
    });
};

var displayEstimateCallForBid = function(idCallForBid) {
    loadContent({
        'items': [
            [globalScope,'mainRight',idCallForBid],
        ]
    });
};

/*------------------------------------------------------------------------*/
/*                  RENDERING RELATED FUNCTIONS
/*------------------------------------------------------------------------*/
var loadContent = function(options) {
    Box.LoaderControl('show');

    options.items.each(function(item,index){
        renderContent(item[0],item[1],item[2]); 
    });

    Box.LoaderControl('hide');
};

var renderContent = function(s,c,p) {
    var myParams = new Hash({
        's' : s,
        'c' : c,
        'p' : p
    });

    var myOptions = new Hash({
        'requestName': 'renderContent',
        'requestType': 'HTML',
        'url': 'render.cgi',
        'onComplete': 'render_'+c,
        'concurrentRequest': 1
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
};

var render_mainEmpty = function(responseHTML,responseJavaScript) {
    $('mainEmpty').setStyle('display','none');
    $('mainEmpty').set('html',responseHTML);
    $('mainEmpty').setStyle('display','block');
    $exec(responseJavaScript);
};

var render_mainLeft = function(responseHTML,responseJavaScript) {
    $('mainLeft').set('html',responseHTML);
    $exec(responseJavaScript);
};

var render_mainRight = function(responseHTML,responseJavaScript) {
    $('mainRight').set('html',responseHTML);
    $exec(responseJavaScript);
};

var render_mainFull = function(responseHTML,responseJavaScript) {
    $('mainFull').set('html',responseHTML);
    $exec(responseJavaScript);
};

var render_mainGroupAdmin = function(responseHTML,responseJavaScript) {
    $('mainGroupAdmin').set('html',responseHTML);
    $exec(responseJavaScript);
    dbug.log('test');
    TabGroupPreferences.Update();
    dbug.log('test');
};

var hide_mainEmpty = function() {
    $('mainEmpty').setStyle('display','none');
    $('mainEmpty').set('html','');
};

var redirect = function(url,delay) {
    var waitAndGo = function() {
        window.location = url;
    };
    waitAndGo.delay(delay);
};

/*------------------------------------------------------------------------*/
/*                  FILE UPLOAD RELATED FUNCTIONS
/*------------------------------------------------------------------------*/
var populateAvatarSelect = function() {
    Box.LoaderControl('show');
    var myParams = new Hash({
        'a' : 2
    });

    var myOptions = new Hash({
        'requestName': 'populateAvatarSelect',
        'requestType': 'text',
        'url': 'upload.cgi',
        'onComplete': 'populateAvatarSelectPost',
        'concurrentRequest': 0
    });

    commonCallAjaxRequest.run([myParams,myOptions]);
}
var populateAvatarSelectPost = function(responseText) {
    Box.LoaderControl('hide');
    var pictureArray = responseText.value;
    
    if( pictureArray == '' )
    {
        $('avatarSelectContainer').set('html','Aucune image trouvée');
    }
    else
    {
        var avatarSelect = new Element ( 'select' , { 'onClick' : 'updateAvatarPicture("preview");' , 'class' : 'flat' , 'id' : 'userAvatarSelect' } );

        pictureArray.each( function(item) {
            var newOption = new Element ( 'option' , { 'value' : item , 'html' : item } );
            if(item == $('userAvatar').getProperty('value').clean())
            {
                $(newOption).selected = true;
            }
            newOption.injectInside(avatarSelect);
        });

        $('avatarSelectContainer').set('html','');
        avatarSelect.injectInside($('avatarSelectContainer'));
    } 
};

var avatarTypeSelect = function(type) {
    if(type == 'image')
    {
        populateAvatarSelect();
        $('avatarSelectContainer').setStyle('display','block');
        $('avatarUploadPicture').setStyle('display','block');
        $('userAvatarTypeImage').checked = true;
        $('userAvatarGravatarLink').setStyle('display','none');
        $('avatarGravatarValid').setStyle('display','none');
        $('userAvatarTypeGravatar').checked = false;
    }
    else
    {
        $('avatarSelectContainer').setStyle('display','none');
        $('avatarUploadPicture').setStyle('display','none');
        $('userAvatarTypeImage').checked = false;
        $('userAvatarGravatarLink').setStyle('display','block');
        $('avatarGravatarValid').setStyle('display','block');
        $('userAvatarTypeGravatar').checked = true;
    }
}

var updateAvatarPicture = function(action) {
    if( action == 'init' )
    {
        $('userAvatar').setProperty('value','');
        $('userAvatarPicture').setProperty('src','images/general/logo.gif');
    }
    else if( action == 'gravatar' )
    {
        newSrc = $('userAvatarGravatarLink').getProperty('value').clean();
        newSrc += '?s=65&r=pg';
        $('userAvatar').setProperty('value',newSrc);
        $('userAvatarPicture').setProperty('src',newSrc);
    }
    else
    {
        newSrc = $('userAvatarSelect').getProperty('value').clean();
        $('userAvatar').setProperty('value',newSrc);
        $('userAvatarPicture').setProperty('src','user/'+newSrc);
    }
}


var uploadAvatarPicture = function() {
    Box.LoaderControl('show');
    /* common upload */
    var myOptions = {
        'uploadId':     'uploadAvatarPictureInstance',
        'clickTo':      $('avatarUploadPicture'),
        'verbose':      false,
        'instantStart': true,
        'startClickTo': true,
        'showLoader':   false,
        'onComplete':   'uploadAvatarPicturePost'
    };

    var myParams = {
        'url':  'upload.cgi',
        'query': {
            'a' : '1'
        }
    };
    commonUploader.run([myOptions, myParams]);
}
var uploadAvatarPicturePost = function(responseJSON) {
    Box.LoaderControl('hide');
    Box.NotifierControl('show',responseJSON);
    populateAvatarSelect();
}

var commonUploader = function(myOptions, myParams){

    if(! myOptions.uploadId || $type(myOptions.uploadId) != 'string')
    {
        if(showDbug) dbug.error('[commonUploader] mandatory option param "uploadId" undefined or not a string !');
    }
    else if(! myOptions.clickTo || $type(myOptions.clickTo) != 'element')
    {
        if(showDbug) dbug.error('[commonUploader] mandatory option param "clickTo" undefined or not an element !');
    }
    else if(! myOptions.instantStart && $type(myOptions.startClickTo) != 'element')
    {
        if(showDbug) dbug.error('[commonUploader] instantStart to false, option param "startClickTo" must be defined and be an element !');
    }
    else if(! myOptions.onComplete || $type(window[myOptions.onComplete]) != 'function')
    {
        if(showDbug) dbug.error('[commonUploader] mandatory option param "onComplete" undefined or function not found !');
    }
    else if(! myParams.url || $type(myParams.url) != 'string')
    {
        if(showDbug) dbug.error('[commonUploader] mandatory param "url" undefined or not a string !');
    }
    else
    {
        var data = {};
        if(myParams.query && $type(myParams.query) == 'object')
        {   
            data = myParams.query;
        }

        // update csid
        //data.csid = csid;

        var verbose = false;
        if(myOptions.verbose)
        {                                                                                                                                                                                         
            verbose = true;                                                                                                                                                                       
        }

        var instantStart = false;
        if(myOptions.instantStart)
        {
            instantStart = true;
        }

        window[myOptions.uploadId] = new Uploader({
            'url':              myParams.url,
            'data':             data,
            'verbose':          verbose,
            'queued':           false,
            'allowDuplicates':  true,
            'target':           myOptions.clickTo,
            'instantStart':     instantStart,
            'onSelectSuccess':  function() {
                if(myOptions.showLoader) display_loader('show', 60000);
            },
            'onFileComplete':   function(file) {
                var responseText = file.response.document.html.children[1].children[0].innerHTML;
                responseText = responseText.clean();
                var responseJSON = JSON.decode(responseText);
                window[myOptions.onComplete].run([responseJSON]);
            }
        });

        $(myOptions.clickTo).addEvents({
            click: function() {
                return false;
            },
            mouseenter: function() {
            this.addClass('uploadhover');
                window[myOptions.uploadId].reposition();
            },                                                                                                                                                                                    
            mouseleave: function() {                                                                                                                                                              
                this.removeClass('uploadhover');
                this.blur();
            },
            mousedown: function() {
                this.focus();
            }
        });

        if(! myOptions.instantStart)
        {
            $(myOptions.startClickTo).addEvent('click', function() {
                window[myOptions.uploadId].start();
            });
        }
    }
};


/*------------------------------------------------------------------------*/
/*                  JAVASCRIPT CLASSES
/*------------------------------------------------------------------------*/

/***************** Hierarchic CheckBoxes Object *****************/
var HierCheck = new Class({
    initialize: function (options) {
        this.competences = options;
        this.selected = new Hash({});
    },

    GetSelected: function(object) {
        var obj = this;
        var hash = new Hash(object);
        var fnret = hash.each( function(value,key) {
            if( $(key).checked && !obj.selected.has(key) ) { 
                obj.selected.set(key,'1');
            }
            else if( !$(key).checked && obj.selected.has(key) )
            {
                obj.selected.erase(key);
            }

            obj.GetSelected(value);
        });
    },

    Toggle: function(id) {
        if($(id).checked)
        {
            this.Select(id,this.competences);
        }
        else
        {   
            var flag=false;
            this.Deselect(id,this.competences,flag);
        }   
    },

    Select: function(id,object) {
        var obj = this;
        var hash = new Hash(object);
        var fnret = hash.some( function(value,key) {
            if( key == id ) { return true; }

            var fnret2 = obj.Select(id,value);
            if( fnret2 )
            {
                $(key).checked = true;
                return true;
            }
        });

        if( fnret ) { return true; }
    },

    Deselect: function(id,object,flag) {
        var obj = this;
        var hash = new Hash(object);

        var fnret = hash.some( function(value,key) {
            var limit = 0;
            if( key == id )
            {
                flag = true;
                limit = 1;
                $(key).checked = false;
            }

            if(flag) { $(key).checked = false; }

            obj.Deselect(id,value,flag);

            if( limit == 1 ) { return true; }
        });

        if( fnret ) { return true; }
    }

});

/***************** Multi usage Box Object ******************/
var MultiBox = new Class({
    initialize: function (options) {
        this.loaderImg = options.loaderImg;
    },

    Recycle: function(element,delay) {
        var dispose = function() {
            element.dispose(); 
        };

        if($chk(element)) { 
            if(delay != '' && delay > 0)
            {
                dispose.delay(delay);
            }
            else
            {
                dispose.run();
            }
        };
    },

    OverlayControl: function(action) {
        if( action == 'show' )
        {
            this.Recycle($('multiBoxOverlay'));
            var Overlay = new Element('div', {
                'id': 'multiBoxOverlay',
                'styles': {
                    'display': 'none',
                    'z-index': 500,
                    'position': 'absolute',
                    'top': '0',
                    'left': '0',
                    'background-color': '#000000',
                    'opacity': .1,
                    'height': window.getScrollHeight() + 'px',
                    'width': window.getScrollWidth() + 'px'
                }
            });
            
            Overlay.injectInside(document.body);

            var OverlayFx = new Fx.Morph(Overlay,{
                'duration': 200,
                'transition': Fx.Transitions.Linear
            });

            OverlayFx.start({
                'display': 'block',
                'opacity': [0,.2]
            });
        } else {
            var OverlayFx = new Fx.Morph($('multiBoxOverlay'),{
                'duration': 200,
                'transition': Fx.Transitions.Linear
            });

            OverlayFx.start({
                'display': 'block',
                'opacity': [0]
            });

            OverlayFx.start({
                'display': 'none'
            });

            this.Recycle($('multiBoxOverlay'),200);
        }
    },

    NotifierControl: function(action,options) {
        if(action == 'show')
        {
            if(options.status)
            {
                if(options.status == 100)
                {   
                    options.title = 'Success';
                    options.color = '#77ff77';
                }
                else if(options.status >= 200)
                {
                    options.title = 'Error';
                    options.color = '#ff7777';
                }
            }

            this.Recycle($('multiBoxContainerN'));
            var Container = new Element('div', {
                'id': 'multiBoxContainerN',
                'class' : 'multiBoxContainerN',
                'styles': {
                    'display': 'none',
                    'position': 'fixed',
                    'bottom': '0px',
                    'left': '0px',
                    'height': '80px',
                    'width': '450px',
                    'z-index': 1000,
                    'overflow': 'hidden',
                    'margin': '0px 0px 2px 2px'
                }
            });

            var Frame = new Element('div', {
                'id': 'multiBoxFrame',
                'class': 'multiBoxFrame',
                'styles': {
                    'position': 'absolute',
                    'top': 0,
                    'left': 0,
                    'z-index': 500,
                    'width': '100%',
                    'height': '100%',
                    'background-color': '#000000',
                    'opacity': .8
                }
            });
            Frame.injectInside(Container);

            var Elements = new Element('div', {
                'id': 'multiBoxElements',
                'styles': {
                    'position': 'absolute',
                    'top': 0,
                    'left': 0,
                    'z-index': 1000,
                    'width': '100%',
                    'height': '100%'
                }
            });
            Elements.injectInside(Container);
           
            var NotifierTitle = new Element('p', {
                'id': 'multiBoxNotifierTitle',
                'html': options.title,
                'class': 'bold',
                'styles': {
                    'text-align': 'left',
                    'margin': '10px 0px 5px 10px',
                    'color': options.color
                }
            });
            NotifierTitle.injectInside(Elements);

            var NotifierMsg = new Element('p', {
                'id': 'multiBoxNotifierMsg',
                'html': options.message,
                'class': 'Swhite',
                'styles': {
                    'text-align': 'left',
                    'margin': '0px 10px 5px 10px'
                }
            });
            NotifierMsg.injectInside(Elements);

            Container.injectInside(document.body);

            var NotifierFx = new Fx.Morph(Container,{
                'duration': 500,
                'transition': Fx.Transitions.Linear
            });

            NotifierFx.start({
                'display': 'block',
                'opacity': [0,1]
            });
            
            var MultiBoxInstance = this;

            var waitAndHide = function() {
                MultiBoxInstance.NotifierControl('hide');
            };
            waitAndHide.delay(3000);
        }
        else
        {
            var PromptFx = new Fx.Morph($('multiBoxContainerN'),{
                'duration': 500,
                'transition': Fx.Transitions.Linear
            });

            PromptFx.start({
                'display': 'block',
                'opacity': [0]
            });

            if( $('multiBoxOverlay') )
            {
                this.OverlayControl('hide');
            }

            PromptFx.start({
                'display': 'none'
            });

            this.Recycle($('multiBoxContainerN'),500);
        }
    },
    PromptControl: function(action,options) {
        if(action == 'show')
        {
            this.Recycle($('multiBoxContainer'));
            var Container = new Element('div', {
                'id': 'multiBoxContainer',
                'class' : 'multiBoxContainer',
                'styles': {
                    'display': 'none',
                    'position': 'fixed',
                    'top': '50%',
                    'left': '50%',
                    'height': '120px',
                    'width': '500px',
                    'z-index': 1000,
                    'margin': '-80px auto auto -250px'
                }
            });

            var Frame = new Element('div', {
                'id': 'multiBoxFrame',
                'class': 'multiBoxFrame',
                'styles': {
                    'position': 'absolute',
                    'top': 0,
                    'left': 0,
                    'z-index': 500,
                    'width': '100%',
                    'height': '100%',
                    'background-color': '#000000',
                    'opacity': .8
                }
            });
            Frame.injectInside(Container);

            var Elements = new Element('div', {
                'id': 'multiBoxElements',
                'styles': {
                    'position': 'absolute',
                    'top': 0,
                    'left': 0,
                    'z-index': 1000,
                    'width': '100%',
                    'height': '100%'
                }
            });
            Elements.injectInside(Container);
           
            var PromptTitle = new Element('p', {
                'id': 'multiBoxPromptTitle',
                'html': options.title,
                'class': 'bold',
                'styles': {
                    'text-align': 'left',
                    'margin': '10px 0px 5px 10px',
                    'color': '#77ff77'
                }
            });
            PromptTitle.injectInside(Elements);

            var PromptMsg = new Element('p', {
                'id': 'multiBoxPromptMsg',
                'html': options.message,
                'class': 'Swhite',
                'styles': {
                    'text-align': 'left',
                    'margin': '0px 10px 5px 10px'
                }
            });
            PromptMsg.injectInside(Elements);

            var MultiBoxInstance = this;

            if( options.type == 'info' )
            {
                var PromptOk = new Element('a', {
                    'id': 'multiBoxPromptOk',
                    'html': 'Ok<div class="smallButtonRight"/>',
                    'class': 'smallButton Fleft',
                    'styles': {
                        'position': 'absolute',
                        'bottom':'10px',
                        'left': '50%',
                        'margin-left': '-25px',
                        'width': '50px'
                    }
                });
                PromptOk.injectInside(Elements);

                PromptOk.addEvent(
                    'click', function() {
                        MultiBoxInstance.PromptControl('hide');
                });
            }
            Container.injectInside(document.body);

            if( options.overlay == true )
            {
                this.OverlayControl('show');
            }

            var PromptFx = new Fx.Morph(Container,{
                'duration': 500,
                'transition': Fx.Transitions.Linear
            });

            PromptFx.start({
                'display': 'block',
                'opacity': [0,1]
            });
        }
        else
        {
            var PromptFx = new Fx.Morph($('multiBoxContainer'),{
                'duration': 500,
                'transition': Fx.Transitions.Linear
            });

            PromptFx.start({
                'display': 'block',
                'opacity': [0]
            });

            if( $('multiBoxOverlay') )
            {
                this.OverlayControl('hide');
            }

            PromptFx.start({
                'display': 'none'
            });

            this.Recycle($('multiBoxContainer'),500);
        }
    },

    LoaderControl: function(action,message) {
        if( action == 'show' )
        {
            this.Recycle($('multiBoxContainer'));
            var Container = new Element('div', {
                'id': 'multiBoxContainer',
                'styles': {
                    'display': 'none',
                    'position': 'fixed',
                    'top': '0px',
                    'left': '50%',
                    'height': '50px',
                    'width': '50px',
                    'z-index': 1000,
                    'margin': '0px auto auto -25px'
                }
            });

            var Frame = new Element('div', {
                'id': 'multiBoxFrame',
                'class': 'multiBoxFrame',
                'styles': {
                    'position': 'absolute',
                    'top': 0,
                    'left': 0,
                    'z-index': 500,
                    'width': '100%',
                    'height': '100%',
                    'background-color': '#000000',
                    'opacity': .8
                }
            });
            Frame.injectInside(Container);

            var Elements = new Element('div', {
                'id': 'multiBoxElements',
                'styles': {
                    'position': 'absolute',
                    'top': 0,
                    'left': 0,
                    'z-index': 1000,
                    'width': '100%',
                    'height': '100%',
                    'line-height': '50px'
                }
            });
            Elements.injectInside(Container);

            var LoaderImg = new Element('img', {
                'id': 'multiBoxLoaderImg',
                'src': this.loaderImg,
                'styles': {
                    'z-index': 1000,
                    'display': 'inline',
                    'vertical-align':'middle',
                    'margin-right': '0px'
                }
            });
            LoaderImg.injectInside(Elements);

            var LoaderMsg = new Element('p', {
                'id': 'multiBoxLoaderMsg',
                'html': message,
                'class': 'Swhite bold',
                'styles': {
                    'z-index': 1000,
                    'display': 'inline',
                    'vertical-align':'middle'
                }
            });
            LoaderMsg.injectInside(Elements);

            Container.injectInside(document.body);

            var LoaderFx = new Fx.Morph(Container,{
                'duration': 500,
                'transition': Fx.Transitions.Linear
            });

            LoaderFx.start({
                'display': 'block',
                'opacity': [0,1]
            });

        } else {
            var BoxObject = this;
            var timer;
            var hide = function() {
                if(requestQueueMulti.hasNext() == false)
                {   
                    var LoaderFx = new Fx.Morph($('multiBoxContainer'),{
                        'duration': 500,
                        'transition': Fx.Transitions.Linear
                    });

                    LoaderFx.start({
                        'display': 'block',
                        'opacity': [0]
                    });

                    timer = $clear(timer);
                    
                    LoaderFx.start({
                        'display': 'none'
                    });

                    BoxObject.Recycle($('multiBoxContainer'),1000);
                }
            };

            timer = hide.periodical(1000);
        }
    }
});

/***************** Tabs Set Object ******************/
var TabSet = new Class({
    initialize: function (options) {
        this.prefix = options.prefix;
        this.nbTabs = options.nbTabs;
        this.sliders = options.sliders;
        this.width = options.width;
        this.height = options.height;
        this.sliderLength = 0;
        this.firstTab = 0;
        this.selectedTab = 0;

        this.Tabs = [];

        for(id=1;id<=options.nbTabs;id++)
        {
            this.Tabs.extend([{
                'head': options.prefix+'-h-'+id ,
                'body': options.prefix+'-b-'+id
            }]);
            
            $(options.prefix+'-h-'+id).setStyles({
                'white-space': 'nowrap'
            });

            $(options.prefix+'-h-'+id).addEvent(
                'click', function() {
                    TabSetInstance.Select(this.get('id'));
            });

            var dimensions = $(options.prefix+'-h-'+id).getComputedSize({
                'styles': ['padding','margin']
            });
            this.sliderLength += dimensions.totalWidth;
            var TabSetInstance = this;
        }

        $(options.prefix+'-h').setStyles({
            'width': options.width,
            'height': options.height
        });

        $(options.prefix+'-b').setStyles({
            'clear': 'both'
        });

        if(options.sliders == true)
        {
            $(options.prefix+'-h-l').setStyles({
                'float': 'left',
                'z-index': '1000'
            });
            $(options.prefix+'-h-l').addEvent(
                'click' , function() {
                    TabSetInstance.TabSlide('right');
            });

            tabBarLength = ((-2-$(options.prefix+'-h-l').getWidth())-($(options.prefix+'-h-r').getWidth())+(options.width));

            $(options.prefix+'-h-c').setStyles({
                'float': 'left',
                'overflow': 'hidden',
                'width': tabBarLength,
                'z-index': '500'
            });

            $(options.prefix+'-h-r').setStyles({
                'float': 'right',
                'z-index': '1000'
            });
            $(options.prefix+'-h-r').addEvent(
                'click' , function() {
                    TabSetInstance.TabSlide('left');
            });
        }

        this.headFx = new Fx.Morph($(this.prefix+'-h-s'),{
            'transition': Fx.Transitions.Linear,
            'duration':100
        });     

        this.bodyFx = new Fx.Morph($(this.prefix+'-b'),{
            'transition': Fx.Transitions.Linear,
            'duration':200
        });     
        
        if(options.selectedTab && this.Tabs[options.selectedTab])
        {
            this.selectedTab = options.selectedTab;
        }

        this.Select(this.Tabs[this.selectedTab].head);
    },
    Update: function () {
        this.Select(this.selectedTab);
    },
    Select: function (tabId) {
        var selectedTab = 0;
        var deselectedTab = 0;
        this.Tabs.each( function(item,index) {
            if(item.head != tabId)
            {
                if($(item.body).getStyle('display') == 'block')
                {
                    $(item.head).set('class','');
                    $(item.body).setStyle('display','none');
                }
            }
            else
            {
                selectedTab = index;
            }
        });

        
        $(this.Tabs[selectedTab].head).set('class','selected');
        $(this.Tabs[selectedTab].body).setStyle('display','block');

        this.bodyFx.start({'height': [
            $(this.prefix+'-b').getStyle('height'),
            $(this.Tabs[selectedTab].body).getDimensions().height
        ]});

        this.selectedTab = selectedTab;
    },
    firstTabControl: function(inc) {
        var temp = (this.firstTab+inc);
        if( temp > (this.Tabs.length-1) )
        {
            this.firstTab = (this.Tabs.length-1)
        }
        else if( temp < 0 )
        {
            this.firstTab = 0;
        }
        else
        {
            this.firstTab = temp;
        }
    },
    TabSlide: function(direction) {
        var selectedTab = this.firstTab;
        var offset = 0;
        var offsetCurrent = $(this.prefix+'-h-s').getStyle('margin-left').toInt();
        var offsetMax = this.sliderLength-$(this.prefix+'-h-c').getWidth();

        if(direction == 'left')
        {   
            for(i=0;i<this.firstTab+1;i++)
            {   
                offset += $(this.Tabs[i].head).getWidth();
            }

            if((selectedTab) < (this.Tabs.length-1) && offsetMax > 0 && (-offsetCurrent) < offsetMax)
            {   
                this.firstTabControl(1);

                if(offset > offsetMax)
                {   
                    this.headFx.start({'margin-left': [offsetCurrent,-offsetMax]});
                }
                else
                {
                    this.headFx.start({'margin-left': [offsetCurrent,-offset]});
                }
            }
        }
        else if(direction == 'right')
        {
            for(i=0;i<this.firstTab-1;i++)
            {
                offset += $(this.Tabs[i].head).getWidth();
            }

            if((selectedTab) > 0)
            {
                this.firstTabControl(-1);

                if(offset < 0)
                {
                    this.headFx.start({'margin-left': [offsetCurrent,0]});
                }
                else if(offset > offsetMax)
                {
                    this.TabSlide('right');
                }
                else
                {
                    this.headFx.start({'margin-left': [offsetCurrent,-offset]});
                }
            }
        }
    }
});
        
