function MainController(){
    var arrControllers;
    this.arrControllers = 0;
    this.listeners = false;

    this.submenu = false;
    this.currentSubmenu = false;

    this.views = false;
    this.currentView = false;
    this.submenuTimer = false;

    this.viewYouTube = function(youtube_id){
    	var div = this.addDiv('mediaDiv','media');
    	var str = '<p><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/'+youtube_id+'&hl=en"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/'+youtube_id+'&hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object></p>';
    	str += "<p><center><a href='javascript:;' onclick='main.hideYouTube();'>St&auml;ng</a></center></p>"
    	div.innerHTML = str;
    	centerAppear("mediaDiv");
    }
    this.hideYouTube = function(youtube_id){
    	Effect.Fade('mediaDiv',{duration:0.4,afterFinish:function(){
	    	var target;
	    	if((target = $('mediaDiv'))){
	    		document.body.removeChild(target);
	    		delete target;
	    	}
    	}
    	});
    }

    this.addDiv = function(targetDiv, className){
        var target;
        if(!(target = $(targetDiv))){
            target = document.createElement('div');
            target.id = targetDiv;
            target.className = className;
            document.body.appendChild(target);
        }
        return target;
    }
    this.initHideSubmenu = function(){
        if(!this.submenuTimer){
            this.submenuTimer = setTimeout('main.hideSubmenu()',500);
        }else{
            clearTimeout(this.submenuTimer);
            this.submenuTimer = setTimeout('main.hideSubmenu()',500);
        }
    }
    this.clearHideSubmenu = function(){
        if(this.submenuTimer){
            clearTimeout(this.submenuTimer);
            this.submenuTimer = false;
        }
    }

    this.getQuestionMarkText = function(){
    	var str = 'Detta &auml;r en snabbs&ouml;k till Shoppingguiden d&auml;r alla v&aring;ra produkter finns samlade.';
    	str += "<br/><br/>Du kan s&ouml;ka efter typ av plagg (kl&auml;nning, byxor), vara (matta, kuddfodral), m&auml;rke (Odd Molly, Acne) eller andra specifika s&ouml;kord (blommig, prickig).<br>Skriv din s&ouml;kning och tryck retur.";
    	return str;

    }

    this.showBubble2 = function(id, dx){

    	//this.clearHideSubmenu();
    	var parents = $(id).ancestors();

        var parent = parents[1];
        var pos = Element.cumulativeOffset(parent);
        var newDiv = this.addDiv(id+'_bubble','bubble2');
        Element.addClassName(newDiv,'bubble2');
        ie = (document.all)? true:false;
        if((ie && isIE7Min())||!ie){
        	var str = "<img src='/public/images/common/kommer_inom_kort.png' border=0 width='67' height='41'>";
        }else{
        	var str = "<img src='/public/images/common/kommer_inom_kort_ie6.gif' border=0 width='67' height='41'>";
        }
        newDiv.innerHTML = str;

        ns = (document.layers)? true:false

        newDiv.setStyle({
            top:(pos.top+15)+'px',
            left:(pos.left+244+dx)+'px'
        });
		Element.show(newDiv);
        setTimeout(function(){Element.hide(id+'_bubble');delete newDiv;},2000);
    }

    this.showBubble = function(id, message){
        var parents = $(id).ancestors();

        var parent = parents[0];
        var topparent = parents[parents.length-1];
        // posDiv is used to find the position of the element
        var posDiv = document.createElement('div');
        Element.addClassName(posDiv,'bubblepos');
        Element.insert($(id), {before:posDiv});
        posDiv.absolutize(posDiv);
        var pos = Element.cumulativeOffset(posDiv);
        parent.removeChild(posDiv);
        delete posDiv;
        var newDiv = this.addDiv('info_bubble_sok');//document.createElement('div');
        //document.body.appendChild(newDiv);
        //Element.addClassName(newDiv,'bubble');

        var str ="<table cellpadding='0' cellspacing='0'>"
		+"<tr>"
		+"	<td class='transPng' width='298px;'height='168px;'>"
		+"	<table cellpadding='0' cellspacing='0'>"
		+"		<tr><td width='6px' height='138px' valign='top'><img src='/public/images/spacer.gif' width='6px' height='138px'></td>"
		+"		<td style='color:#ffffff;font-size:12px;text-align:left;' width='292px' height='138px' valign='top'>"
		+"			<p style='padding:0px;margin:20px 10px 0px 10px;height:118px;text-align:left;'>"
					+ message +"</p>"
		+"		</td></tr>"
		+"		<tr><td width='6px' height='30px'><img src='/public/images/spacer.gif' width='6px' height='30px'></td>"
		+"			<td style='color:#ffffff;font-size:13px;' width='292px' height='30px'>"
		+"				<p style='padding:0;margin:5px 15px 10px 0px;text-align:right;font-size:13px;font-weight:bold;height:15px;'>"
		+"					<a style='color:#ffffff;' href='javascript:;' onclick='$(\"info_bubble_sok\").style.display=\"none\";'>St&auml;ng</a>"
		+"				</p>"
		+"			</td>"
		+"		</tr>"
		+"	</table>"
		+"	</td>"
		+"</tr>"
		+"</table>";

        newDiv.innerHTML = str;
        newDiv.setStyle({
            top:(pos.top-17)+'px',
            left:(pos.left+45)+'px',
            position:'absolute',
            backgroundImage:'url(/public/images/sg/middle/infopopup.png)',
            backgroundRepeat:'norepeat',
            width:'298px',
            height:'168px'

        });
        Element.show(newDiv);
    }


    this.hideSubmenu = function(section){
        $('submenu').innerHTML = this.submenu;
        Event.stopObserving('submenu','mouseout',this.bInitHideSubmenu);
        Event.stopObserving('img_'+this.currentSubmenu,'mouseout',this.bInitHideSubmenu);
        Event.stopObserving('submenu','mouseover',this.bClearHideSubmenu);
        Event.stopObserving('img_'+this.currentSubmenu,'mouseover',this.bClearHideSubmenu);
    }

    this.showSubmenu = function(section){
        if(this.submenu==false){
            this.submenu = $('submenu').innerHTML;
        }
        this.currentSubmenu = section;
        if(this.bInitHideSubmenu==undefined){
            this.bInitHideSubmenu = this.initHideSubmenu.bindAsEventListener(this);
            this.bClearHideSubmenu = this.clearHideSubmenu.bindAsEventListener(this);
        }
        $('submenu').innerHTML = $('submenu_'+section).innerHTML;
        Event.observe('submenu','mouseout',this.bInitHideSubmenu);
        Event.observe('img_'+section,'mouseout',this.bInitHideSubmenu);
        Event.observe('submenu','mouseover',this.bClearHideSubmenu);
        Event.observe('img_'+section,'mouseover',this.bClearHideSubmenu);
    }
    this.cacheView = function(viewName, url, func){
        if(func!=undefined){
            this.setView(viewName + "_func",func);
        }
                new Ajax.Request(
                    url,{
                         method:'post',
                         onSuccess: function(transport){
                             var json = transport.responseText;
                             json = eval('('+json+')');
                             if(json.Result==0){
                                 //msgBox('Cached ' + json.viewName,300);
                                main.setView(json.viewName, json.mainContent);
                             }
                         },
                         onFailure: function(transport) {
                         }
                    }
                    );
    }
    this.switchView = function(viewName){
        var content, handle;
        if((content = this.views.get(viewName))!=undefined){
            $('mainContent').innerHTML = content;
            if((handle = this.views.get(viewName+'_func'))!=undefined){
                handle.call();
            }
            return true;
        }else
            return false;
    }
    this.saveView = function(viewName, func){
        this.setView(viewName, $('mainContent').innerHTML, func);
    }
    this.getView = function(viewName){
        var content;
        if((content = this.views.get(viewName))!=undefined)
            return content;
        else
            return false;
    }

    this.setView = function(viewName, content, func){
        this.views.set(viewName,content);
        if(func!=undefined){
            this.setView(viewName + "_func",func);
        }

    }

    this.innerRequest = function(args){
        var param = args[1];
        switch(param){
            case "coverText":
                var target = "coverDiv";
                var text = args[2];
                ns4 = (document.layers)? true:false
                ie4 = (document.all)? true:false
                winW = (ns4)? window.innerWidth : document.body.offsetWidth;
                winH = (ns4)? window.innerHeight : document.body.offsetHeight;

                var deltaY = getScrollY();
                $(target).style.left = 0 + "px";
                $(target).style.width = winW + "px";
                $(target).style.top = deltaY + "px";
                $(target).style.height = winH + "px";

                Effect.Appear(target,{duration:0.3,to:0.5});

                target = 'coverTextDiv';
                var x = Math.round(winW - 640)/2;
                var y = 100+deltaY;
                $(target).style.left = x + "px";
                $(target).style.top = y + "px";

                var str = '<center>Loading<br><img src="/public/images/loader_onwhite.gif"></center>';
                $(target).innerHTML = str;
                Effect.Appear(target);
                url = "/text/"+text+"/";
                new Ajax.Request(
                    url,{
                         method:'post',
                         postBody:params,
                         onSuccess: function(transport){
                            var json = transport.responseText;
                            json += "<br>&nbsp;<br>";
                            json += "<center><a href='javascript:;' onclick='Effect.Fade(\"coverDiv\");Effect.Fade(\"coverTextDiv\");'>Close</a></center>"
                            $(target).innerHTML = json;

                         },
                         onFailure: function(transport) {
                            msgBox("Server connection failure. Please try again later.",1500);
                            Effect.Fade("coverDiv");
                            Effect.Fade("coverTextDiv");
                         }
                    }
                    );

                //AboutUs
            break;
            case "ExpandFeedback":
                var target = 'betafeedback';
                if($(target)){

                    if($(target).style.display=='none'){
//                        tempBetaContent = $(target).innerHTML;
                        Effect.BlindDown(target);
                            //$(target).innerHTML = tempBetaContent;
                            //$(target).style.zIndex = 110;

                    }else{
                        if($F('feedback_text')!=''){
                            var str = "You haven't send your feedback.<br>";
                            str += "Do you want to send it now?<br>&nbsp;<br>";
                            str += "<center><a href='javascript:;' onclick='mainController.request([\"Main\",\"BetaSendFeedback\"]);'>Yes</a> &nbsp; &nbsp; &nbsp; ";
                            str += "<a href='javascript:;' onclick='hideBox();'>No</a></center>";
                            msgBox(str);
                        }

                        Effect.BlindUp(target);
                    }
                }
                break;
            case "BetaSendFeedback":
                //var email = $F('feedback_email');
                //var name = $F('feedback_name');
                var text = $F('feedback_text');
                if(text==''){
                    Effect.Shake('feedback_text');
                    $('feedback_text_error').innerHTML = " - Please enter feedback";
                    return;
                }else{
                    $('feedback_text_error').innerHTML = "";
                }
                msgBox('<center><img src="/public/images/loader_ongrey.gif"></center><br>Sending feedback');
/*                var params = "email="+escape(email);
                params += "&name="+escape(name);*/
                var params = "text="+escape(text);
                url = "/beta/feedback/";
                var target = 'betafeedback';
                new Ajax.Request(
                    url,{
                         method:'post',
                         postBody:params,
                         onSuccess: function(transport){
                            msgBox("Thank you for your feedback!",1500);
//                            $('feedback_email').value='';
                            $('feedback_text').value='';
//                            $('feedback_name').value='';
                            Effect.BlindUp(target);
                         },
                         onFailure: function(transport) {
                            msgBox("Server connection failure. Please try again later.",1500);
                         }
                    }
                    );

                break;
        }

    }
    this.getController = function(controllerName){
        switch(controllerName){
            case "Product":
                return(this.arrControllers[0]);
                break;
            case "Gene":
                return(this.arrControllers[1]);
                break;
            case "User":
                return(this.arrControllers[2]);
                break;
            case "Main":
                return(main);
                break;
        }
    }
    this.request = function(args){
        //log(args[0] + ":" + args[1]);
        name = args[0];
        var controller;
        switch(name){
            case "Product":
                controller = this.arrControllers[0];
                break;
            case "Gene":
                controller = this.arrControllers[1];
                break;
            case "User":
                controller = this.arrControllers[2];
                break;
            case "Main":
                this.innerRequest(args);
                return;
                break;
        }
        controller.request(args);
    }
    this.load = function(name){
        document.write('<script src="/public/scripts/controllers/'+name+'/'+name+'Controller.js" type="text/javascript"></script>');
    }
    this.afterLoad = function(){
        /*this.arrControllers = new Array(
        new ProductController(),
        new GeneController(),
        new UserController()
        );*/
    }
    this.addControllers = function()
	{
		this.load('Product');
		this.load('User');
		this.load('Gene');

		this.arrControllers = new Array(
	        null,
	        null,
	        null
	   	 );
	   	this.addControllerTimer = setTimeout('main.addControllerTick()',100);
	}
	this.addControllerTick = function()
	{
		anyleft = false;
		if(this.arrControllers[0]==null)
		{
			if(ProductController != undefined)
			{
				this.arrControllers[0] = new ProductController();
			}else
				anyleft = true;
		}
		if(this.arrControllers[2]==null)
		{
			if(UserController != undefined)
			{
				this.arrControllers[2] = new UserController();
			}else
				anyleft = true;
		}
		if(this.arrControllers[1]==null)
		{
			if(GeneController != undefined)
			{
				this.arrControllers[1] = new GeneController();
			}else
				anyleft = true;
		}
		if(anyleft == false)
       		clearTimeout(this.addControllerTimer);
       	else
       		this.addControllerTimer = setTimeout('main.addControllerTick()',100);
	}
}

    var main = new MainController();
    var ProductController;
	var GeneController;
	var UserController;

    main.addControllers();

function afterLoad(){

    //main.afterLoad();
    main.views = new Hash();
    if($('topleft_search')!=undefined){
    Event.observe('topleft_search','keypress',function(event){
                   if(event.keyCode==Event.KEY_RETURN){
                   		$('topleft_search_form').submit();
                   }
                    //    main.request(new Array('Product','search',$F('topleft_search')));
                });
    }
   	//fetchPendingCommands();
}
var getScrollY = function() {
  return window.pageYOffset ||
         (document.documentElement && document.documentElement.scrollTop) ||
         (document.body && document.body.scrollTop);
}

function centerAppear(divId){
    ns4 = (document.layers)? true:false
    ie4 = (document.all)? true:false
    winW = (ns4)? window.innerWidth-16 : document.body.offsetWidth-20;
    Element.makePositioned(divId);
    d = $(divId).getDimensions();
    left = Math.round((winW-d.width)/2);
    $(divId).style.left = left + "px";

//  var x = 200;
  var y = 100;

  deltaY = getScrollY();
  y += deltaY;
  //Element.setStyle(divId,{top:y});
  $(divId).style.top = y + "px";

  Effect.Appear(divId,{'duration':0.9});
}
function msgBox(message, timer)
 {


  var msgbox = $('infoDiv');
  message = message + "<br>&nbsp;<br><center><a href='javascript:;' onclick='hideBox();'>Close</a></center>";
  msgbox.innerHTML = message;
    ns4 = (document.layers)? true:false
    ie4 = (document.all)? true:false
    winW = (ns4)? window.innerWidth-16 : document.body.offsetWidth-20;
    d = $('infoDiv').getDimensions();
    left = Math.round((winW-d.width)/2);
    var img = new Image();
    img.src= "/public/images/loader_ongrey.gif";
    $('infoDiv').style.left = left + "px";

//  var x = 200;
  var y = 200;
  deltaY = getScrollY();
  //alert(getScrollY());
  y += deltaY;
//  Element.setStyle('infoDiv',{left:x});
  //Element.setStyle('infoDiv',{top:y});
  $('infoDiv').style.top = y + "px";
  Effect.Appear('infoDiv',{'duration':0.2});
  if(timer){
      setTimeout("hideBox()",timer);
  }
 }
 function hideBox(message)
 {
  var msgbox = $('infoDiv');
  Element.hide('infoDiv');
 }
  function msgBoxBlueLarge(message, timer)
 {
 	hideBoxBlueAll();
	  var msgbox = $('msgbox_l_div');
	  var msgspan = $('msgbox_l_span');
	  //message = message + "<br>&nbsp;<br><center><a href='javascript:;' onclick='hideBoxLarge();'>Close</a></center>";
	  msgspan.innerHTML = message;
	    ns4 = (document.layers)? true:false
	    ie4 = (document.all)? true:false
	    winW = (ns4)? window.innerWidth-16 : document.body.offsetWidth-20;
	    d = $('msgbox_l_div').getDimensions();
	    left = Math.round((winW-d.width)/2);

	    $('msgbox_l_div').style.left = left + "px";

	//  var x = 200;
	  var y = 200;
	  deltaY = getScrollY();
	  //alert(getScrollY());
	  y += deltaY;

	  $('msgbox_l_div').style.top = y + "px";
	  Effect.Appear('msgbox_l_div',{'duration':0.2});
	  if(timer){
	      setTimeout("hideBoxBlueLarge()",timer);
	  }
 }
 function hideBoxBlueLarge()
 {
	  var msgbox = $('msgbox_l_div');
	  Element.hide('msgbox_l_div');
 }
 function msgBoxBlueSmall(message, timer)
 {
 	hideBoxBlueAll();
	  var msgbox = $('msgbox_s_div');
	  var msgspan = $('msgbox_s_span');
	  //message = message + "<br>&nbsp;<br><center><a href='javascript:;' onclick='hideBoxSmall();'>Close</a></center>";
	  msgspan.innerHTML = message;
	    ns4 = (document.layers)? true:false
	    ie4 = (document.all)? true:false
	    winW = (ns4)? window.innerWidth-16 : document.body.offsetWidth-20;
	    d = $('msgbox_s_div').getDimensions();
	    left = Math.round((winW-d.width)/2);

	    $('msgbox_s_div').style.left = left + "px";

	//  var x = 200;
	  var y = 200;
	  deltaY = getScrollY();
	  //alert(getScrollY());
	  y += deltaY;

	  $('msgbox_s_div').style.top = y + "px";
	  Effect.Appear('msgbox_s_div',{'duration':0.2});
	  if(timer){
	      setTimeout("hideBoxBlueSmall()",timer);
	  }
 }
 function hideBoxBlueSmall()
 {
	  var msgbox = $('msgbox_s_div');
	  Element.hide('msgbox_s_div');
 }
 function msgBoxBlueMini(message, timer)
 {
 	hideBoxBlueSmall();
 	hideBoxBlueLarge();
	  var msgbox = $('msgbox_mini_div');
	  var msgspan = $('msgbox_mini_span');
	  //message = message + "<br>&nbsp;<br><center><a href='javascript:;' onclick='hideBoxSmall();'>Close</a></center>";
	  msgspan.innerHTML = message;
	    ns4 = (document.layers)? true:false
	    ie4 = (document.all)? true:false
	    winW = (ns4)? window.innerWidth-16 : document.body.offsetWidth-20;
	    d = $('msgbox_mini_div').getDimensions();
	    left = Math.round((winW-d.width)/2);

	    $('msgbox_mini_div').style.left = left + "px";

	//  var x = 200;
	  var y = 200;
	  deltaY = getScrollY();
	  //alert(getScrollY());
	  y += deltaY;

	  $('msgbox_mini_div').style.top = y + "px";
	  Effect.Appear('msgbox_mini_div',{'duration':0.2});
	  if(timer){
	      setTimeout("hideBoxBlueMini()",timer);
	  }
 }
 function hideBoxBlueMini()
 {
	  var msgbox = $('msgbox_mini_div');
	  Element.hide('msgbox_mini_div');
 }
 function hideBoxBlueAll()
 {
 	hideBoxBlueMini();
 	hideBoxBlueSmall();
 	hideBoxBlueLarge();
 }
function loadImages(imageUrlArr){
        for(i=0;i<imageUrlArr.length;i++){
            var img = new Image();
            img.src = imageUrlArr[i];
        }
    }
    function log(str){
        var target = 'log';
        if($(target))
            $(target).innerHTML = str + "<br>" + $(target).innerHTML;

    }

function setExecutedCommand(ajax_message_id){
    var url = "/feedsview/setajaxstatusexecuted";
    var params = 'ajax_message_id='+ajax_message_id;
    new Ajax.Request(
        url,{
             method:'post',
             postBody:params,
             onSuccess: function(transport){
             },
             onFailure: function(transport) {
             }
        }
        );
}


function fetchPendingCommands(){
    var url = "/feedsview/fetchpendingcommands";
    new Ajax.Request(
        url,{
             method:'post',
             onSuccess: function(transport){
	             var json = transport.responseText;
	             json = eval('('+json+')');
	             if(json.Result==0){
	             	for(var i=0;i<json.commands.length;i++){
	             		eval(json.commands[i].command);
	             		setExecutedCommand(json.commands[i].ajax_message_id);
	             	}
	            }
	            setTimeout('fetchPendingCommands()',1000);
             },
             onFailure: function(transport) {
             	setTimeout('fetchPendingCommands()',1000);
             }
        }
        );
}

function submitForm(formName){
    ns4 = (document.layers)? true:false
    ie4 = (document.all)? true:false
    if(ie4){
        $(formName).submit();
    }

}
function getIEVersionNumber() {
    var ua = navigator.userAgent;
    var MSIEOffset = ua.indexOf("MSIE ");

    if (MSIEOffset == -1) {
        return 0;
    } else {
        return parseFloat(ua.substring(MSIEOffset + 5, ua.indexOf(";", MSIEOffset)));
    }
}

function isIE7Min(){
	return (getIEVersionNumber() >= 7);
}

function toggleshow(span_id){
	var div1 = document.getElementById(span_id)
	if (div1.style.display == 'none') {
		div1.style.display = 'block'
	} else {
		div1.style.display = 'none'
	}
}
function setValue(id, value){
    $(id).value = value;
    main.request(new Array("Product","fullsearch"));
}
function cacheView(viewName, url, func){
    main.cacheView(viewName, url, func);
}