
function ex_exec( func ){
       if( typeof(func) == 'function' ){
           func();
       }else if( typeof(func)=='object' && func.length ){
           var f = func[0];
           var params = new Array;
           if( func.length>1 ){ params = params.concat(func[1]); }
           f.apply(null, params);
       }
}

function if_load( check_function, script_url, callback, callback_else ){
    if(check_function()){
        load_script( script_url, callback );
    }else{
        ex_exec( callback_else ); 
    }
    
}


function load_script(script_url, callback){
    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    script.src = script_url;
    script.onload = function(){ ex_exec(callback) };
    script.onreadystatechange = function() {
              if(this.readyState == "loaded"  || 
                 this.readyState == "complete") { ex_exec(callback); } }
    head.appendChild(script);
}

function J_load(callback, callback_else){
    if_load( function(){ return typeof(jQuery)=='undefined' }, '/js/jquery.min.js', callback, callback_else);
}

function DP_loc_load(callback){
    load_script('/js/jquery.ui.datepicker-ru.js', callback);
}

function JUI_load(callback, callback_else){
    if_load( 
        function(){ return typeof(jQuery.ui)=='undefined' }, 
        '/js/jquery.ui.min.js', 
        callback, 
        callback_else);
}


function HK_load(callback){
    if_load( function(){ return typeof(jQuery.hot_key)=='undefined' }, '/js/jquery.hot_key.js', callback);
}

function TS_load(callback){
    load_script( '/js/jquery.textselect.js', callback);
}

function VAL_load(callback){
    if_load( function(){ return typeof(jQuery.validate)=='undefined' }, '/js/jquery.validate.js', callback);
}

function ATC_load(callback, callback_else){
    if_load( function(){ return typeof(jQuery.autocomplete)=='undefined' }, '/js/jquery-autocomplete/jquery.autocomplete.js', callback, callback_else);
}


function DIMENSION_load(callback, callback_else){
    if_load( function(){ return true; }, 
            '/js/jquery.dimensions.js', callback, callback_else);
}

function TT_load(callback, callback_else){
    if_load( function(){ return typeof(jQuery.tooltip)=='undefined' }, 
            '/js/jquery.tooltip.min.js', callback, callback_else);
}

function BI_load(callback, callback_else){
    if_load( function(){ return typeof(jQuery.borderImage)=='undefined' }, 
            '/js/jquery.borderimage.js', callback, callback_else);
}

function J_load_full(callback, iteration){
    var iterations = [ [J_load,1],       //load jQuery
                       [JUI_load,2],     //jQuery UI
                       [HK_load,3],      //Hot key
                       [TS_load,4],      //Text select
                       [ATC_load,5],     //autocompleter
                       [VAL_load,6],     //validation
                       [DIMENSION_load,7],//for tooltips
                       [TT_load, 8]       //tooltips
                           ];

    iteration = iteration || 0; 
    if( iteration<iterations.length ){
        var func = iterations[iteration][0];
        var next_iteration = iterations[iteration][1];
        func( [J_load_full, [callback,next_iteration]], [J_load_full, [callback,next_iteration]] );
    }else{
        ex_exec( callback );
    }
}

