﻿/**
* Imtech JavaScript library
* Composed 2006 by Waldek Mastykarz | Imtech ICT BS
* All rights reserved  
* @created		2006-11-03 18:00:00
* @modified	2006-11-15 08:30:00
* @version		1.4
* 
* CHANGES LOG:
* 1.4		~ Imtech. replaced with this. (bug fix)
* 			~ AJAX-based script loading replaced with document.write (IE bug fix)  
* 1.3		+ AJAX-based script loading implemented
* 1.2		+ modules namespaces added
* 			~ modules saved externally 
* 1.1		+ $() for getting objects added      
*/
// Declare the Imtech namespace
var Imtech = {
  version: "1.4",
  loadPath: "",
  load: function() {
    this.loadPath = window.Imtech.loadPath || ""; // declare the load path for the library files

    for (var i = 0; i < this.load.arguments.length; i++) {
      document.write("<script type=\"text/javascript\" src=\"" + this.loadPath + "imtech." + this.load.arguments[i] + ".lib.js\"></script>");
    }
  }
}

/****** GENERAL ******/

/**
* is... functions
*/
Imtech.isArray = function(a) {
  return isObject(a) && a.constructor == Array;
}

Imtech.isBoolean = function(a) {
  return typeof a == 'boolean';
}

Imtech.isFunction = function(a) {
  return typeof a == 'function';
}

Imtech.isNull = function(a) {
  return a === null;
}

Imtech.isObject = function(a) {
  return (a && typeof a == 'object') || this.isFunction(a);
}

Imtech.isString = function(a) {
  return typeof a == "string";
}

Imtech.isUndefined = function(a) {
  return typeof a == "undefined";
}

/**
* Returns object. If no such object found returns bool(false)
* @author		Waldek Mastykarz | Imtech ICT BS
* @version		1.1 		 
* @param		string|object		Object to return
* @dependency	Imtech.isFunction 
* @dependency	Imtech.isObject
* @dependency	Imtech.isUndefined 
* 
* CHANGES LOG:
* 1.1		+ parameters recognition   
*/
Imtech.$ = function(obj) {
  if (!this.isUndefined(obj) &&
		this.isFunction &&
		this.isFunction(this.isObject)) {
    if (this.isObject(obj))
      return obj;
    else if (document.getElementById &&
			document.getElementById(obj))
      return document.getElementById(obj);
    else
      return false;
  }
  else
    return false;
}

Imtech.Behavior = Imtech.Behavior || {};
Imtech.Behavior.attachEvent = function(event, func, obj) {
  if (!obj) {
    return false;
  }

  if (typeof obj.event != "undefined") {
    obj.addEventListener(event, func, false);
  }
  else if (typeof document.addEventListener != "undefined") {
    document.addEventListener(event, func, false);
  }
  else if (typeof obj.attachEvent != "undefined") {
    obj.attachEvent('on' + event, func);
  }
  else
    return false;
}

Imtech.Behavior.selectListItem = function(list, value) {
  for (var i = 0; i < list.options.length; i++) {
    if (list.options[i].value == value) {
      list.options[i].selected = true;
      return true;
    }
  }
}

Imtech.dependentLists = function(sourceListId, defaultValue) {
  var id = sourceListId;
  var list = document.getElementById(id);
  var parent = list.parentNode;
  var groups = null;
  var masterList = null;
  var dependentListWrapper = null;
  var dependentList = null;
  var defaultValue = defaultValue;
  var callbacks = null;

  var getGroups = function() {
    var groupItems = list.getElementsByTagName("optgroup");
    var groups = new Array(groupItems.length);

    for (var i = 0; i < groupItems.length; i++) {
      var listItemOptions = groupItems[i].getElementsByTagName("option");
      var listItems = new Array(listItemOptions.length);

      for (var j = 0; j < listItemOptions.length; j++) {
        listItems[j] = {
          text: listItemOptions[j].text,
          value: listItemOptions[j].value
        }
      }

      groups[i] = {
        name: groupItems[i].label,
        listItems: listItems
      }
    }

    return groups;
  };

  var render = function(container) {
    masterList = document.createElement("select");
    masterList.appendChild(document.createElement("option"));

    for (var i = 0; i < groups.length; i++) {
      var listItem = document.createElement("option");
      listItem.text = groups[i].name;
      listItem.innerText = groups[i].name;
      listItem.value = groups[i].listItems[0].value;
      masterList.appendChild(listItem);
    }

    if (typeof callbacks != "undefined" && typeof callbacks.masterListCssClass != "undefined") {
      masterList.className = callbacks.masterListCssClass;
    }

    Imtech.Behavior.attachEvent("change", masterListChange, masterList);

    if (typeof callbacks != "undefined" && typeof callbacks.masterListBefore != "undefined") {
      callbacks.masterListBefore(container);
    }

    container.appendChild(masterList);

    if (typeof callbacks != "undefined" && typeof callbacks.masterListAfter != "undefined") {
      callbacks.masterListAfter(container);
    }

    dependentListWrapper = document.createElement("div");
    dependentListWrapper.className = "dependentList";

    dependentList = document.createElement("select");

    if (typeof callbacks != "undefined" && typeof callbacks.dependentListCssClass != "undefined") {
      dependentList.className = callbacks.dependentListCssClass;
    }

    Imtech.Behavior.attachEvent("change", dependentListChange, dependentList);

    if (typeof callbacks != "undefined" && typeof callbacks.dependentListBefore != "undefined") {
      callbacks.dependentListBefore(dependentListWrapper);
    }

    dependentListWrapper.appendChild(dependentList);

    if (typeof callbacks != "undefined" && typeof callbacks.dependentListAfter != "undefined") {
      callbacks.dependentListAfter(dependentListWrapper);
    }

    container.appendChild(dependentListWrapper);
  };

  var masterListChange = function(event) {
    if (typeof event.target == "undefined" || event.target == masterList) {
      renderDependentList();
      Imtech.Behavior.selectListItem(list, masterList.options[masterList.selectedIndex].value);
    }
  }

  var renderDependentList = function() {
    var selectedIndex = masterList.selectedIndex;
    if (selectedIndex > 0) {
      dependentList.innerHTML = "";
      dependentListWrapper.style.display = groups[selectedIndex - 1].listItems.length > 1 ? "block" : "none";
      dependentList.appendChild(document.createElement("option"));
      for (var i = 1; i < groups[selectedIndex - 1].listItems.length; i++) {
        var listItem = document.createElement("option");
        listItem.text = groups[selectedIndex - 1].listItems[i].text;
        listItem.innerText = groups[selectedIndex - 1].listItems[i].text;
        listItem.value = groups[selectedIndex - 1].listItems[i].value;
        dependentList.appendChild(listItem);
      }
    }
    else {
      dependentListWrapper.style.display = "none";
    }
  };

  var dependentListChange = function(event) {
    if (typeof event.target == "undefined" || event.target == dependentList) {
      if (dependentList.selectedIndex > 0) {
        Imtech.Behavior.selectListItem(list, dependentList.options[dependentList.selectedIndex].value);
      }
      else {
        Imtech.Behavior.selectListItem(list, masterList.options[masterList.selectedIndex].value);
      }
    }
  }

  var setDefaultValue = function() {
    if (typeof defaultValue != "undefined" && defaultValue.length > 0) {
      var value = defaultValue.split(";#");
      Imtech.Behavior.selectListItem(masterList, value[0] + ";#");

      renderDependentList();
      Imtech.Behavior.selectListItem(list, masterList.options[masterList.selectedIndex].value);

      if (value.length > 1) {
        Imtech.Behavior.selectListItem(dependentList, defaultValue);
        Imtech.Behavior.selectListItem(list, defaultValue);
      }
    }
    else {
      dependentListWrapper.style.display = "none";
    }
  }

  this.init = function(renderingCallbacks) {
    callbacks = renderingCallbacks;
    groups = getGroups();
    render(parent);
    setDefaultValue();
    list.style.display = "none";
  };
}