//namespace
if (typeof GP == "undefined") { var GP = {}; }
if (typeof GP.stat == "undefined") { GP.stat = {}; }

/** Frame object */
GP.stat.Frame=(function(){
	var $C=YAHOO.util.Connect, $E=YAHOO.util.Event, $D=YAHOO.util.Dom, $=function(x) {return YAHOO.util.Dom.get(x);};
  	var request
  	var loadCount = 0
  	var initTitle		// stores initial title, base for more specific ones
  	var selected_url; //For multi-url frames stores URL selected 
    var urldata; //JSON-parsed text of the DIV
    var multiurl_div; //DIV which has description of a kind of page has been loaded in its ID

	var showStatfooters = function(show) {
		if (show)
			$D.removeClass($('statfooters_root'),'hidden')
		else 
			$D.addClass($('statfooters_root'),'hidden')
	}
	
	/**
	 * Sets document title with value, found in first H1 in given documentRoot 
	 */
	var setTitleByHeader = function (documentRoot) {
		var title = documentRoot.getElementsByTagName('h1')
		title = title.length ? title[0].firstChild.nodeValue+' : ' : ''
		document.title = title + initTitle
	}
	
	var fixFrameWidthHandler = function () {
		var content	= $D.getElementsByClassName('scope', 'table', 'frame_content')
		if (0==content.length) content	= $D.getElementsByClassName('cupstage', 'table', 'frame_content')
		if (0==content.length) return; else content = content[0];
		
		var waitForWidth = function (content) {
			if (content.clientWidth) {
				if ($D.getViewportWidth() < content.clientWidth+280)
					$D.addClass(content, 'bigContent')
			} else {
				setTimeout(function() {waitForWidth(content)}, 500)
			}
		}
		waitForWidth(content)
	}
	
	/**
	 * waits for contentReady event for frame content nice positioning
	 */
	var fixFrameWidth = function () {
		$E.onContentReady('frame_content', fixFrameWidthHandler) 
	}
	
	/**
	 * calls 
	 */
	var callFrameScriptByUrl = function (url) {
		
	} 
	
	/**
	 * Callback success handler, is executed when section info request succeed
	 */
  	var handleSuccess = function(o){
  		
    	var div = $("frame");
      	if (div && o.responseText !== undefined) {
            div.innerHTML = o.responseText;
            GP.stat.Util.enhashLinks(div);
			setTitleByHeader(div);
			selected_url = o.argument.url;
            multiurl_div = $D.getElementsByClassName("multiurl","div",div)[0];
            var infodiv = $("urlinfo");
          	urldata = YAHOO.lang.JSON.parse(infodiv.innerHTML);
			setNavInfo(div);
      	}
      	GP.util.Event.fire("Loading process", false);	// reduce loading counter
      	request = null;
		// show main statfooters if no framefooters
		showStatfooters(!$('statfooters_frame'));
      	fixFrameWidth();
    }

	/**
	 * Sets navigation by frame navinfo section
	 */    
    var setNavInfo = function (div,onsuccess,onfailure) {
        //Information to set navigation items in proper way
        var navdata = null;
        //var infodiv = $D.getElementsByClassName("urlinfo","div",div)[0];
        if (multiurl_div) {
        	try {
            	if (urldata[selected_url]) {
                    //alert(urldata[selected_url].page_id);
            		multiurl_div.id = urldata[selected_url].page_id;
            		//multiurl_div.className = urldata[selected_url].page_class;
      				navdata = urldata[selected_url].navigation;
                    GP.util.Event.fire("Loading process", false)
            	}
          	} catch (exc) {
        		//Handled later, checking if navdata is null;
            }
        }
        if (!navdata) {
        	if (onfailure) onfailure(); else GP.stat.Error.show("FRJSON", loadUrl, selected_url)
        } else {
        	if (onsuccess) onsuccess(); else {
                GP.util.Event.fire("FrameScript exec", multiurl_div.className);
		      	GP.util.Event.fire("Statistics loaded", navdata);
		    }
	    }
    }
  
	/** 
	 * Callback failure handler, is executed when section info request failed 
	 */
  	var handleFailure = function(o){
  		showStatfooters(false);		// hide root statfooters
	    if (o.status>=0) { //Request failed, not aborted
	       	GP.stat.Error.show("FRUPLD_"+o.status,loadUrl,o.argument.url)
	       	if (o.status==404)
	       		$("frame").innerHTML = "";
		}
    	GP.util.Event.fire("Loading process", false);	// reduce loading counter
	    request = null;
    }  
  
	/**
	 * Requests data of the frame by url
	 * @param xlid e - section's extended id 
	 */
  	var loadUrl = function(url) {
	    if (!url) return;
	    var old_url = selected_url;
	    selected_url = url;
  		var doLoadUrl = function() {
                GP.util.Event.fire("Loading process", true);
	    		selected_url = old_url;
			    var callback = { 
				    success:handleSuccess, 
				    failure: handleFailure, 
				    argument: {url:url} 
			    }; 
			    if (request) $C.abort(request);
			    request = $C.asyncRequest("GET", url, callback);
    		}
    	try {
	        //var infodiv = $D.getElementsByClassName("urlinfo","div",$("frame"))[0];
		    setNavInfo(
		    	$("frame"),
		    	function() {GP.util.Event.fire("Statistics loaded", urldata[url].navigation)},
		    	doLoadUrl)
	    } catch (exc) {
	    	doLoadUrl();
	    }
    }
  
	/**
	 * Extracts url and calls 'load'
	 * @param data data - struct with url field 
	 */
	var loadEventListener = function(data) {
		if (!data.url.match(/gametype\d+\/|section\d+\//)) {
		    GP.util.Event.fire("Loading process", true)
		    loadUrl(data.url)
		} else {
    		var div = $("frame")
    		div.innerHTML = ""
			setTitleByHeader(div)
			showStatfooters(true)
		}
	}
  
/**
 * Loading process indication
 * @param boolean show - true if new loading is started and false if recent loading is finished 
 */
	var loadingProcess = function (show) {
	    if (show) {
		    if (0 == loadCount) {
		        $D.removeClass('frame_status', 'hidden')
		        $D.addClass('frame', 'hidden')
		      }
		    loadCount++
	    } else {
		    if (2 > loadCount) {
		        $D.addClass('frame_status', 'hidden')
		        $D.removeClass('frame', 'hidden')
		    }
		    loadCount--
	    }
	}

	/**
	 * Frame object initiator
	 */
	var init = function(){
		initTitle = document.title;
	    GP.util.Event.addListener("Nav item chosen", loadEventListener);
	    GP.util.Event.addListener("Loading process", loadingProcess);
	    GP.stat.FrameUtil.init();
	}
	return {init:init, setNavinfo:setNavInfo};
})()
