var CHELLO = window.CHELLO || {};
CHELLO.utils = CHELLO.utils || {};
CHELLO.widgets = CHELLO.widgets || {};

CHELLO.utils.load = function (filename) {
	//document.write('<script type="text/javascript" src="' + filename + '"><script>');
	scriptTag = document.createElement("script");
	scriptTag.type = "text/javascript";
	scriptTag.charset = "utf-8";
	scriptTag.src = filename;
	document.getElementsByTagName("head")[0].appendChild(scriptTag);
	
}

CHELLO.utils.isUndefined = function (value) {
	return (typeof value == "undefined")
}

CHELLO.utils.getClasses = function () {
	var classes = {};
	var url = "";
	var scriptTags = document.getElementsByTagName("SCRIPT");
	for (var idx = 0; idx < scriptTags.length; idx++) {
		if ((url = scriptTags[idx].src).indexOf("nav_creator.js") > -1) {
			var query = this.parseQueryString(url);
			classes.top = query.t || "topnavContainer";
			classes.left = query.l || "ch_leftnavContainer";
		}
	}
	return classes;
}

CHELLO.utils.parseQueryString = function (url) {
	var result = {};
	var loc = url.split("?");
	if (loc.length > 1) {	
		var tmp = loc[1].split("&");
		for (var idx = 0; idx < tmp.length; idx++) {
			var pair = tmp[idx].split("=");
			result[decodeURI(pair[0])] = decodeURI(pair[1]);
		}
	}
	return result;
}

var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

function $(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($(arguments[i]));
    return elements;
  }
  if (typeof element == 'string')
    element = document.getElementById(element);
  return element;
}

if (!window.Event) {
  var Event = new Object();
}

Object.extend(Event, {
  stop: function(event) {
    if (event.preventDefault) {
      event.preventDefault();
      event.stopPropagation();
    } else {
      event.returnValue = false;
      event.cancelBubble = true;
    }
  },

  observers: false,

  _observeAndCache: function(element, name, observer, useCapture) {
    if (!this.observers) this.observers = [];
    if (element.addEventListener) {
      this.observers.push([element, name, observer, useCapture]);
      element.addEventListener(name, observer, useCapture);
    } else if (element.attachEvent) {
      this.observers.push([element, name, observer, useCapture]);
      element.attachEvent('on' + name, observer);
    }
  },

  unloadCache: function() {
    if (!Event.observers) return;
    for (var i = 0, length = Event.observers.length; i < length; i++) {
      Event.stopObserving.apply(this, Event.observers[i]);
      Event.observers[i][0] = null;
    }
    Event.observers = false;
  },

  observe: function(element, name, observer, useCapture) {
    element = $(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
        || element.attachEvent))
      name = 'keydown';

    Event._observeAndCache(element, name, observer, useCapture);
  },

  stopObserving: function(element, name, observer, useCapture) {
    element = $(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
        || element.detachEvent))
      name = 'keydown';

    if (element.removeEventListener) {
      element.removeEventListener(name, observer, useCapture);
    } else if (element.detachEvent) {
      try {
        element.detachEvent('on' + name, observer);
      } catch (e) {}
    }
  }
});

/* prevent memory leaks in IE */
if (navigator.appVersion.match(/\bMSIE\b/))
  Event.observe(window, 'unload', Event.unloadCache, false);

Object.extend(Event, {
  _domReady : function() {
    if (arguments.callee.done) return;

    arguments.callee.done = true;

    if (Event._timer)  clearInterval(Event._timer);
    
	for (var idx=0; idx < Event._readyCallbacks.length; idx++) {
		Event._readyCallbacks[idx]();
	}
    Event._readyCallbacks = null;
    
  },
  onReady : function(f) {
    if (!this._readyCallbacks) {
      var domReady = this._domReady;
      
      if (domReady.done) return f();
      
      if (document.addEventListener)
        document.addEventListener("DOMContentLoaded", domReady, false);
        
        /*@cc_on @*/
        /*@if (@_win32)
//            document.write('<script id="__ie_onload" defer src="javascript:void(0)"><\/script>');;
//            document.getElementById("__ie_onload").onreadystatechange = function() {
//                if (this.readyState == "complete") { domReady(); }
//            };
        /*@end @*/
        
        if (/WebKit/i.test(navigator.userAgent)) { 
          this._timer = setInterval(function() {
            if (/loaded|complete/.test(document.readyState)) domReady(); 
          }, 10);
        }
        
        Event.observe(window, 'load', domReady);
        Event._readyCallbacks =  [];
    }
    Event._readyCallbacks.push(f);
  }
});

String.prototype.aSub = function (srcArray, tgtArray) {
	var result = this.toString();
	for (var idx=0; idx < srcArray.length; idx++) {
		var src = new RegExp(srcArray[idx], "g");
		if (! CHELLO.utils.isUndefined(tgtArray[idx])) {
			var tgt = tgtArray[idx];
		} else {
			var tgt = "";
		}
		if (result.indexOf(srcArray[idx]) > -1) {
			result = result.replace(src, tgt);
		}
	}
	return result;
}

if (CHELLO.utils.isUndefined(Array.prototype.contains)) {
	Array.prototype.contains = function (value) {
		for (var idx=0; idx < this.length; idx++) {
			if (this[idx] == value) {
				return true;
			}
		}
		return false;
	}
}

function load_ext_script(src) {
	var x = document.createElement("script");
	x.src = src;
	x.type = "text/javascript";
	document.getElementsByTagName("head")[0].appendChild(x);
}

function execJS(node)
{
  //debugger;
  var bSaf = (navigator.userAgent.indexOf('Safari') != -1);
  var bOpera = (navigator.userAgent.indexOf('Opera') != -1);
  var bMoz = (navigator.appName == 'Netscape');

  if (!node) return;

  /* IE wants it uppercase */
  var st = node.getElementsByTagName('SCRIPT');
  var strExec;

  for(var i=0;i<st.length; i++)
  {
  	if (typeof st[i].src != "undefined" && st[i].src != "") {
		load_ext_script(st[i].src);
		continue;
	}
    if (bSaf) {
      strExec = st[i].innerHTML;
      st[i].innerHTML = "";
    } else if (bOpera) {
      strExec = st[i].text;
      st[i].text = "";
    } else if (bMoz) {
      strExec = st[i].textContent;
      st[i].textContent = "";
    } else {
      strExec = st[i].text;
      st[i].text = "";
    }

    try {
      var x = document.createElement("script");
      x.type = "text/javascript";

      /* In IE we must use .text! */
      if ((bSaf) || (bOpera) || (bMoz))
        x.innerHTML = strExec;
      else x.text = strExec;

      document.getElementsByTagName("head")[0].appendChild(x);
    } catch(e) {
      alert(e);
    }
  }
};

function isJSLoaded() { 
	if ((typeof nav != "undefined") && !scriptWritten) {
		scriptWritten = true;
		CHELLO.utils.load("http://www.upclive.com" + nav.siteMapUrl);
		CHELLO.utils.load("http://www.upclive.com/javascript/pc/partners/nav_" + nav.secondaryNavStyle.toLowerCase() + ".js");
		CHELLO.utils.load("http://www.upclive.com/javascript/pc/upclivenl/tabs.js");
		
	}
	
	
	if ((typeof nav != "undefined") && (typeof siteMap != "undefined") && (typeof CHELLO.widgets.Navigation[nav.secondaryNavStyle] != "undefined")) {
		clearInterval(ivIsSiteMapLoaded);
		var classes = CHELLO.utils.getClasses();
		CHELLO.objNav = new CHELLO.widgets.Navigation[nav.secondaryNavStyle](classes.top, classes.left);
		if (CHELLO.widgets.TabView) {
			new CHELLO.widgets.TabView("searchTabs", {onSwitch: onTabSwitch});
		}
	}
}

function initialize () {
  scriptWritten = false;
	ivIsSiteMapLoaded = setInterval (isJSLoaded, 5);	
}

CHELLO.widgets.Navigation = function () {}
CHELLO.widgets.Navigation.prototype = {
	containerTop: null,
	containerLeft: null,
	navigationTop: null,
	navigationLeft: null,
	menuLevel: 0,
	mainCount: 0, 
	fragments: {
		logo: "",
		searchBar: "",
		tools: "",
		breadcrumb: "",
		mainMenu: "",
		leftMenu: ""
	},
	navInitialize: function (elementTop, elementLeft) {
		this.containerTop = $(elementTop);
		this.containerLeft = $(elementLeft);
		if (!(CHELLO.utils.isUndefined(nav) && CHELLO.utils.isUndefined(siteMap) && CHELLO.utils.isUndefined(template))) {
			try {			
				this.siteMap = siteMap;
				this.template = template;
			  throw("testing iframes");				
				this.activeChannels = nav.activeChannelIds;
				this.selectedChannel = nav.selectedChannelId;
				this.menuStyle = nav.secondaryNavStyle.toLowerCase();
				this.bcCount = 1;
				
				this.homeURL = this.siteMap.logo.href;

				this.fragments.leftMenu = this.createNavFragments(siteMap.channels);
				this.fragments.mainMenu = this.template.mainNav.main.aSub(["<%main_items%>"], [this.fragments.mainMenu])
				this.createOtherFragments();
				this.display();
			} catch (e) {
        this.displayIframes();
      }
		}
	},
	createOtherFragments: function () {
		try {
			this.fragments.logo = this.getFragment("logo");
			this.fragments.searchBar = this.getFragment("searchbar");
			this.fragments.tools = this.getFragment("tools");
			return true;
		} catch (e) {
    alert(e.message);
	//		throw ("Error while building top navigation");
		}
	},
	getFragment: function (tplName) {
		var fragment = "";
		switch (tplName) {
			case "logo":
				var logo = siteMap.logo;
				fragment = this.template.logo.aSub(["<%logo_src%>", "<%logo_alt%>", "<%logo_href%>","<%logo_width%>","<%logo_height%>"], [logo.src, logo.alt, logo.href, logo.width, logo.height]);
				break;
			case "searchbar":
				fragment = siteMap.searchBar;
				break;
			case "tools":
				fragment = this.buildTools(siteMap.tools);
				break;
		}
		return fragment;
	},
	channelHasSubChannels: function (channel) {
		if (!CHELLO.utils.isUndefined(channel.channels) && channel.channels.length > 0) {
			return true;
		} else {
			return false;
		}
	},
	displayIframes: function () {
		var scripts = document.getElementsByTagName('script');
		var topnav_src = '';
		var leftnav_src = '';
		var iframes = [];
		for (var idx=0; idx < scripts.length; idx++) {
			var s = scripts[idx];
			if ( s.src && (vars=s.src.match(/(.*)\/json\/(.*).js$/))) {
				topnav_src = vars[1] + '/topnav/' + vars[2] + '.html';
				leftnav_src = vars[1] + '/leftnav/' + vars[2] + '.html';
				iframes['top'] = this.template.topNav.iframe;
				iframes['top'] = iframes['top'].aSub(["<%top_iframe_url%>"], [topnav_src]);		
				iframes['left'] = this.template.leftNav.iframe;
				iframes['left'] = iframes['left'].aSub(["<%left_iframe_url%>"], [leftnav_src]);
				break;
			}
		}
		if (this.containerTop != null) {
      this.containerTop.innerHTML = iframes['top'];
    } 
    if (this.containerLeft != null) {
		  this.containerLeft.innerHTML = iframes['left'];
		}
  },
	buildTools: function () {
		// STUB: replace in actual class
		return "";
	},
	createNavFragments: function () {
		// STUB: replace in actual class
		return "";
	},
	display: function () {
		// STUB: replace in actual class
	}
}

Event.observe(window, "load", initialize);

