var ims_Class = new function() {
    this.classes = new Array();
    this.count = 0;
    this.serverURL = "http://www.iamsync.ru";
    this.path = this.serverURL;
    this.httpsServerURL = "http://www.iamsync.ru:80";
    this.httpsPath = this.httpsServerURL;
}

ims_Class.languagesDetect = function() {
    ims_Class.supportedLanguages = ["en", "ru", "uk"];
    ims_Class.acceptedLanguages = ["en-us", "en"];
    ims_Class.cookieLanguage = ims_Class.getCookie("iamsynclanguage");
    if (ims_Class.cookieLanguage) {
        ims_Class.acceptedLanguages.splice(0, 0, ims_Class.cookieLanguage);
    }
    ims_Class.language = "en";
    for (var i = 0; i < ims_Class.acceptedLanguages.length; i++) {
        var accepted = ims_Class.acceptedLanguages[i];
        for (var j = 0; j < ims_Class.supportedLanguages.length; j++) {
            var supported = ims_Class.supportedLanguages[j];
            if(accepted.indexOf(supported) == 0){//for ex: en-us is ok for en
                ims_Class.language = supported;
                return;
            }
        }
    }
}

ims_Class.getCookie = function(name) {
    var dc = document.cookie;

    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    } else
        begin += 2;

    var end = document.cookie.indexOf(";", begin);
    if (end == -1) end = dc.length;

    return unescape(dc.substring(begin + prefix.length, end));
}

ims_Class.getServerURL = function() {
    return ims_Class.serverURL;
}

ims_Class.setPath = function(path) {
    ims_Class.path = ims_Class.serverURL + path;
    ims_Class.httpsPath = ims_Class.httpsServerURL + path;
    ims_Class.languagesDetect(); /* Caution, it must be in another place */
}

ims_Class.getPath = function() {
    return ims_Class.path;
}

ims_Class.load = function(name) {
    ims_Class.loadByPath(name, ims_Class.path);
}


ims_Class.loadByPath = function(name, path) {
   var parts = name.split(".");
   var shortName = parts[parts.length - 1];
   ims_Class.loaded = false;
   if (typeof ims_Class.classes[shortName] == "undefined") {
      ims_Class.classes[shortName] = 0;
      ims_Class.count++;
      setTimeout( function(){
         // Caution, we need to rewrite it with regular expressions
         var src = path + "/" + parts.join("/") + ".js";
         var headRef = document.getElementsByTagName("head").item(0);
         var scriptRef = document.createElement("script");
         scriptRef.setAttribute("type", "text/javascript");
         scriptRef.setAttribute("src", src);
         scriptRef.setAttribute("charset", "utf-8"); // Safari doesn't work without it correctly
         headRef.appendChild(scriptRef);
      }, 0);
   }
}


ims_Class.httpsLoad = function(name) {
    ims_Class.loadByPath(name, ims_Class.httpsPath);
}

ims_Class.getConstructor = function(anObject) {
    if (typeof anObject == "string") {
        return window[anObject];
    } else if (typeof anObject == "function") {
        return anObject;
    } else if (anObject !== null && typeof anObject == "object") {
        return anObject.constructor;
    } else {
        return null;
    }
}

ims_Class.createInstance = function(aConstructor, aClass) {
        if (typeof aConstructor == "function" && typeof aClass == "function" && aClass !== Object) {
                var oldPrototype = aConstructor.prototype;
                aConstructor.prototype = new aClass();
                aConstructor.prototype.constructor = aConstructor;
                aConstructor.superClass = aClass.prototype;
                for (var name in oldPrototype) {
                        aConstructor.prototype[name] = oldPrototype[name];
                }
                aConstructor.$extend = true;
                return new aConstructor();
        } else {
            return null;
    }
};


ims_Class.extend = function(anObject, aClass) {
    var doExtend = function(anObject, aClass) {
        var cons = anObject.constructor;
        if (cons.$extend === undefined) {
            var inheritClass = ims_Class.getConstructor(aClass);
            return ims_Class.createInstance(cons, inheritClass);
        } else {
            return anObject;
        }
    }
    var result = doExtend.call(ims_Class, anObject, aClass);
    var inheritClass = ims_Class.getConstructor(aClass);
    if (typeof(inheritClass) === "function") {
        inheritClass.call(result);
    }
    return result;
}

ims_Class.setAfterLoadCallback = function(afterLoadCallback) {
    ims_Class.afterLoadCallback = afterLoadCallback;
    if (ims_Class.count == 0) {
        ims_Class.loaded = true;
        setTimeout(function(){
          ims_Class.afterLoadCallback();
        }, 0);
    }
}

ims_Class.callback = function(shortName) {
    ims_Class.classes[shortName] = 1;
    ims_Class.count--;
    if (ims_Class.count == 0) {
        ims_Class.loaded = true;
        if (typeof ims_Class.afterLoadCallback != "undefined") {
           setTimeout(function(){
             ims_Class.afterLoadCallback();
           }, 0);
        }
    }
}

var ims_Resource = new function() {
}

ims_Resource.load = function(name) {
   ims_Class.load(name+ "_" + ims_Class.language);
}

var ims_Style = new function() {
}

ims_Style.load = function(path) {
    var href = ims_Class.path + "/" + path;
    var head = document.getElementsByTagName("head").item(0);
    var link = document.createElement("link");
    link.setAttribute("href", href);
    link.setAttribute("rel", "stylesheet");
    link.setAttribute("type", "text/css");
    head.appendChild(link);
}


