//Defines an Operating System level controller for the Web OS
//Author: Brian R Miedlar (c) 2006-2007 (miedlar.com)

var OS = Class.create();
OS.PageLoading = true;
OS.PageLoadComplete = function() {
    OS.PageLoading = false;
    $A(OS.BehaviourQueue).each(function(selectors) {
        OS.ApplyBehaviour(selectors);
    });
    OS.BehaviourQueue = [];
};
Event.observe(document, 'dom:loaded', function() {
    OS.PageLoadComplete();
});
OS.BehaviourQueue = [];
OS.RegisterBehaviour = function(selectors) {
    if(!OS.PageLoading) { OS.ApplyBehaviour(selectors); return; }
    OS.BehaviourQueue.push(selectors);    
}
OS.ApplyBehaviour = function(selectors) {
    $H(selectors).each(function(item) {
        var sKey = item.key;
        //console.time('Apply ' + sKey);
        var iDelay = 0;
        var iToken = sKey.indexOf("!D");
        if (iToken > 0) {
            iDelay = parseFloat(sKey.substring(iToken + 2)) || 0;
            sKey = sKey.substring(0, iToken);
            iDelay = parseInt(iDelay);
        }
        $$(sKey).each(function(element) {
            if (!iDelay) { item.value(element); return; }
            item.value.delay(iDelay, element);
        });
        //console.timeEnd('Apply ' + sKey);
    });
};


OS.AppendChild = function(parent, type, classname, id) {
    var eChild = document.createElement(type);
    if(classname) Element.addClassName(eChild, classname);
    if(id) eChild.id = id;
    return parent.appendChild(eChild);
}    
OS.AppendDiv = function(parent, classname) { return OS.AppendChild(parent, 'div', classname); }
OS.AppendSpan = function(parent, classname) { return OS.AppendChild(parent, 'span', classname); }
OS.AppendCaption = function(parent, value, classname) { var eCaption = OS.AppendSpan(parent, classname); eCaption.innerHTML = value; return eCaption; }

OS.AppendGroup = function(parent, caption, data, groupClass, dataClass, captionClass) {
    var cGroup = 'group'; if(groupClass) cGroup += ' ' + groupClass;
    var cCaption = 'caption'; if(captionClass) cCaption += ' ' + captionClass;
    var cData = 'data'; if(dataClass) cData += ' ' + dataClass;
    var eGroup = OS.AppendDiv(parent, cGroup);
    var eCaption = OS.AppendSpan(eGroup, cCaption);
    eCaption.innerHTML = caption;
    var eData = OS.AppendSpan(eGroup, cData);
    eData.innerHTML = data;
    return eGroup;
}

OS.GetQuerystring = function(variable){ 
    var query = window.location.search.substring(1); 
    var vars = query.split("&"); 
    for (var i=0;i<vars.length;i++) { 
        var pair = vars[i].split("="); 
        if (pair[0] == variable) { 
            return pair[1]; 
        } 
    } 
    return null;
};

OS.GetCookie = function(name) {
    var cookies = document.cookie;
    if (cookies.indexOf(name) != -1) {
        var startpos = cookies.indexOf(name) + name.length + 1;
        var endpos = cookies.indexOf(";", startpos);
        if (endpos == -1) endpos = cookies.length;
        var sCookie = '';
        try {
            sCookie = unescape(cookies.substring(startpos, endpos));
        } catch (e) {
            sCookie = unescape(cookies.substring(startpos, endpos - 1));
        }
        return sCookie;
    } else {
        return false; //cookie never set or expired
    }
}
OS.SetCookie = function(name, value, expires, path, domain, secure) {
    var dNow = new Date();
    dNow.setTime(dNow.getTime());

    if (expires) expires = expires * 1000 * 60 * 60; //convert from hours
    var dExpire = new Date(dNow.getTime() + (expires));
    document.cookie = name + "=" + escape(value) + ((expires) ? ";expires=" + dExpire.toGMTString() : "") +
        ((path) ? ";path=" + path : "") + ((domain) ? ";domain=" + domain : "") + ((secure) ? ";secure" : "");
}


Element.SafeHide = function(element) {
    Element.addClassName(element, 'safeHide');
};
Element.SafeShow = function(element) {
    Element.removeClassName(element, 'safeHide');
};
Element.removeChildren = function(element) {
    element.innerHTML = '';
}

