TYPE_TOGGLE = "toggle";
TYPE_CTRL = "ctrl";
TYPE_FCTRL = "fctrl";
ENABLE_LOOP = false;
function initToggle() {
if (arguments[0]) {
TYPE_TOGGLE = arguments[0];
}
if (arguments[1]) {
TYPE_CTRL = arguments[1];
}
if (arguments[2]) {
TYPE_FCTRL = arguments[2];
}
if (arguments[3]) {
ENABLE_LOOP = arguments[3].toLowerCase() == "true";
}
boggle_ctrl = cssQuery( '*[class^="' + TYPE_CTRL + '"]' );
boggle_fctrl = cssQuery( '*[class^="' + TYPE_FCTRL + '"]' );
boggle_events = new Array();
boggle_defaults = cssQuery("." + TYPE_CTRL + "-default");
len = boggle_defaults.length;
if (len == 0) {
boggle_defaults.push(boggle_ctrl[0]);
}
for (var i = 0; i < len; i++) {
boggle_defaults[ i ].className = boggle_defaults[ i ].className.split(TYPE_CTRL + "-default").join("") + " " + TYPE_CTRL;
}
var len;
var c;
var hash;
len = boggle_ctrl.length;
for (var i = 0; i < len; i++) {
e = boggle_ctrl[ i ];
c = e.className;
hash = e.href.split("#")[1];
if (hash) {
e.className = TYPE_CTRL + "-" + hash + " " + e.className;
}
e.onclick = function() { boggleTrigger(this); };
}
len = boggle_fctrl.length;
for (var i = 0; i < len; i++) {
e = boggle_fctrl[ i ];
c = e.className;
hash = e.href.split("#")[1];
if (hash) {
e.className = TYPE_FCTRL + "-" + hash + " " + e.className;
}
e.onclick = function() { boggleTrigger(this); return false; };
}
}
function setDefaultState() {
hash = document.location.hash.slice(1);
hashToggle = cssQuery("." + TYPE_CTRL + "-" + hash)[0];
var len = boggle_defaults.length;
for (var i = 0; i < len; i++) {
if (hashToggle && (boggle_defaults[i].className.match("^" + TYPE_CTRL + "-" + hash.split("-")[0]) != null)) {
boggleTrigger(hashToggle);
} else {
boggleTrigger(boggle_defaults[i]);
}
}
}
function addBoggleEvent(triggerKey, type, group, key) {
if (boggle_events[triggerKey] == undefined) {
boggle_events[triggerKey] = new Array();
}
boggle_events[triggerKey].push({ type:type, group:group, key:key });
}
function boggleTrigger(e) {
if (!e) {
return false;
}
var token = e.className.split(" ")[0].split("-");
var type = token[0];
var groupName = token[1];
var key = token[2];
boggleExecute(type, groupName, key);
}
function boggleExecute(type, groupName, key, bubble) {
var groupList = cssQuery( '*[class^="' + TYPE_CTRL + '-' + groupName + '"]' );
var currentElement = null;
if (type == TYPE_CTRL) {
currentElement = cssQuery( '*[class^="' + TYPE_CTRL + '-' + groupName + '-' + key + '"]' )[0];
} else {
currentElement = cssQuery( '*[class*="' + TYPE_CTRL + '-' + groupName + '-on"]' )[0];
}
var pos = in_array(groupList, currentElement);
var len = groupList.length;
if (pos < 0) {
currentPosition = 0;
}
if (type == TYPE_FCTRL) {
switch(key) {
case "next" :
if (pos < len - 1) {
pos += 1;
} else {
if (ENABLE_LOOP) {
pos = 0;
}
}
break;
case "prev" :
if (pos > 0) {
pos -= 1;
} else {
if (ENABLE_LOOP) {
pos = len - 1;
}
}
break;
case "first" :
pos = 0;
break;
case "last" :
pos = len - 1;
break;
default :
pos = 0;
break;
}
}
var toggleClass = TYPE_TOGGLE + "-" + groupName + "-";
var ctrlClass = TYPE_CTRL + "-" + groupName + "-";
for (var i = 0; i < len; i++) {
currentKey = groupList[i].className.split("-")[2].split(" ")[0];
toggles = cssQuery("." + TYPE_TOGGLE + "-" + groupName + "-" + currentKey);
if (i == pos) {
switchClass(groupList[i], ctrlClass + "on", ctrlClass + "off");
for(var j = 0; j < toggles.length; j++) {
switchClass(toggles[j], toggleClass + "on", toggleClass + "off");
}
} else {
switchClass(groupList[i], ctrlClass + "off", ctrlClass + "on");
for(var j = 0; j < toggles.length; j++) {
switchClass(toggles[j], toggleClass + "off", toggleClass + "on");
}
}
}
if (!ENABLE_LOOP) {	
fctrl = cssQuery("." + TYPE_FCTRL + "-" + groupName + "-prev")[0];
if (fctrl) {
if (pos == 0) {
switchClass(fctrl, TYPE_FCTRL + "-" + groupName + "-disabled", TYPE_FCTRL + "-" + groupName + "-enabled");
} else {
switchClass(fctrl, TYPE_FCTRL + "-" + groupName + "-enabled", TYPE_FCTRL + "-" + groupName + "-disabled");
}
}
fctrl = cssQuery("." + TYPE_FCTRL + "-" + groupName + "-next")[0];
if (fctrl) {
if (pos == len - 1) {
switchClass(fctrl, TYPE_FCTRL + "-" + groupName + "-disabled", TYPE_FCTRL + "-" + groupName + "-enabled");
} else {
switchClass(fctrl, TYPE_FCTRL + "-" + groupName + "-enabled", TYPE_FCTRL + "-" + groupName + "-disabled");
}
}
}
if ((bubble != undefined) && (bubble == false)) {
if (boggle_events[type] != undefined) {
executeBoggleEvents(boggle_events[type]);
}
if (boggle_events[type + "-" + groupName] != undefined) {
executeBoggleEvents(boggle_events[type + "-" + groupName]);
}
if (boggle_events[type + "-" + groupName + "-" + key] != undefined) {
executeBoggleEvents(boggle_events[type + "-" + groupName + "-" + key]);
}
}
}
function executeBoggleEvents(evtList) {
var len = evtList.length;
for (var i = 0; i < len; i++) {
evt = evtList[i];
boggleExecute(evt.type, evt.group, evt.key, false);
}
}
function addSimpleToggle(controller, target) {
if (typeof(controller) == "string") controller = $(controller);
if (typeof(target) == "string") target = $(target);
if ((controller == undefined) || (target == undefined)) {
return false;
}
controller.onclick = function() {
target.style.display = target.style.display != "none" ? "none" : "";
return false;
};
}
function switchClass(e, addClass, removeClass) {
var c = e.className;
if (removeClass) c = c.split(removeClass).join("");
if (addClass) c = c.split(addClass).join("");
e.className = c + " " + addClass;
}
function $() {
var elements = new Array();
for (var i = 0; i < arguments.length; i++) {
var element = arguments[i];
if (typeof element == 'string')
element = document.getElementById(element);
if (arguments.length == 1)
return element;
elements.push(element);
}
return elements;
}
function in_array(a, p) {
var len = a.length;
for (var i = 0; i < len; i++) {
if (a[i] == p) {
return i;
}
}
return -1;
}
function addEvent( obj, type, fn ) {
if (obj.addEventListener) {
obj.addEventListener( type, fn, false );
EventCache.add(obj, type, fn);
}
else if (obj.attachEvent) {
obj["e"+type+fn] = fn;
obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
obj.attachEvent( "on"+type, obj[type+fn] );
EventCache.add(obj, type, fn);
}
else {
obj["on"+type] = obj["e"+type+fn];
}
}
var EventCache = function(){
var listEvents = [];
return {
listEvents : listEvents,
add : function(node, sEventName, fHandler){
listEvents.push(arguments);
},
flush : function(){
var i, item;
for(i = listEvents.length - 1; i >= 0; i = i - 1){
item = listEvents[i];
if(item[0].removeEventListener){
item[0].removeEventListener(item[1], item[2], item[3]);
};
if(item[1].substring(0, 2) != "on"){
item[1] = "on" + item[1];
};
if(item[0].detachEvent){
item[0].detachEvent(item[1], item[2]);
};
item[0][item[1]] = null;
};
}
};
}();
