function aEncodeURI(o) {
	if(o == null) {
		return null;
	}
	else if(o == {}) {
		return "";
	}
	if(typeof(o)!= "object") {
		o = o.toString();
	}
	if(typeof(o)=="string") {
		return encodeURIComponent(o);
	}
	
	var ret = "";
	$.each(o, function (k,v) {
		k = encodeURIComponent(k);
		v = encodeURIComponent(v);
		ret += k+"="+v+"&";
	});
	return ret.substr(0,ret.length-1);
	
}
function deparam(query) {
  var query_string = {};
  var vars = query.split("&");
  //alert("whole="+query);
  for (var i=0;i<vars.length;i++) {
    var pair = vars[i].split("=");
    //alert(["pair="+vars[i],"\n pair[0]="+pair[0],"\npair[1]="+pair[1]]);
    
    pair[0] = decodeURIComponent(pair[0]);
    pair[1] = decodeURIComponent(pair[1]);
    
    //alert(["pair[0]="+pair[0],"\npair[1]="+pair[1]]);
        // If first entry with this name
    if (typeof query_string[pair[0]] === "undefined") {
      query_string[pair[0]] = pair[1];
        // If second entry with this name
    } else if (typeof query_string[pair[0]] === "string") {
      var arr = [ query_string[pair[0]], pair[1] ];
      query_string[pair[0]] = arr;
        // If third or later entry with this name
    } else {
      query_string[pair[0]].push(pair[1]);
    }
  } 
  return query_string;
};
function trimFirst(str,chr) {
	if(str.length > 0) {
		var ca = str.charAt(0);
		if(ca == chr) {
			var ret = str.substr(1);
			return ret;
		}
	}
	return str;
}
var Asine = {
	_state: null,
	_page : null,
	stateChanged : function(newState) {
		var state;
		
		newState = trimFirst(newState,'#');
		newState = trimFirst(newState,'!');
		//alert("nState="+newState);
		if(newState == "") {
			//state = {url : "templates/Home.jsp"};
			state = {};
		}
		else {
			state = deparam(newState);
		}
		Asine._state = state;
		Asine.readState();
	},
	setState : function(state) {
		var str = /*"!" +*/ $.param(state,true);
		$.history.load(str);
	},
	getState : function() {
		return Asine._state;
	},
	readState : function() {
		var state = Asine._state;
		var url = state.pPage;
		
		var mc = $("#MainContent");
		var title = state.title;
		if(title) {
			document.title = title;
			//$("head > title").text(title);
		}
		if(url) {
			url = "/" + url;
			_gaq.push(['_trackPageview', url]);
			$.get(url,function(data) {
				mc.fadeOut("fast",function() {
					mc.html(data);
					//mc.find("a.ajaxurl[href]").each(transformStaticLink);
					mc.fadeIn("slow");
				});
			});
		}
	},
	contactContext : null,
	Config : {
		current : {
			Ajax : true,
			Animations: true
		},
		load: function() {
			var cfg = $.cookie('AsineConfig');
			if(cfg) {
				cfg = JSON.parse(cfg);
				$.extend(Asine.Config.current,cfg);
				Asine.Config.apply();
			}
		},
		apply: function() {
			$.fx.off = ! Asine.Config.current.Animations;//disable animations = !is animations enabled
			var cfg = JSON.stringify(Asine.Config.current);
			$.cookie('AsineConfig',cfg, {expires:90, path:'/'});
		}
	}
};


function transformStaticLink() {
	var prefix = "/main?";
	var anch = $(this);
	var url = anch.attr("href");
	
	if(url.indexOf(prefix)==0) {
		url = url.substring(prefix.length);
		var query = url.substring(prefix.length);
		var urlObj = deparam(query);
		url = "/"+urlObject.pPage;
		//url = decodeURIComponent(url);
		//url = "/"+url.substring(prefix.length);
		
		url = $.param({"pPage":url},true);
		
		anch.click(function(e) {
			if(Asine.Config.current.Ajax) {
				
				window.location.hash = url;
				e.preventDefault();
				return false;
			}
		});
		//anch.attr("href",url);
	}
}

function processMenuItems(lis) {
	lis.each(function() {
		var li = $(this);
		li.addClass('ui-state-default');
		li.hover(function() {
			$(this).addClass("ui-state-hover");
		},
		function() {
			$(this).removeClass("ui-state-hover");
			//$(this).addClass("li-state-default");
		});
		var submenu = li.children("ul.asine-sub-menu");
		submenu.addClass('ui-state-default ui-corner-all');
		if(submenu.length > 0) {
			li.hover(
				function() {
					if(!li.parent().hasClass("asine-menu")) {
						var pos = li.position();
						submenu.css("top",(pos.top));
					}
					submenu.stop(true,true);
					submenu.slideDown();
				},
				function() {
					submenu.stop(true,true);
					submenu.fadeOut();
				}
			);
			//ui-corner-all
			var chlds = submenu.children("li");
			chlds.first().addClass("ui-corner-top");
			chlds.last().addClass("ui-corner-bottom");
			processMenuItems(chlds);
		}
	});
}
function AsineMenu(root) {
	var c = root.children("li");
	c.addClass('main-item ui-corner-all'); //bug for IE6 not supported E > F css selector
	processMenuItems(c);

	/*var menuItems = root.find("a[href]");
	menuItems.each(transformStaticLink);*/
}


function AsineGlobalError(evnt,xhr,ajaxO,err) {
	var errHtml = '<div class="ui-helper-hidden" id="AjaxError">An unexpected error has occurred. Please refresh the page.<br/><button id="AjaxErrorDetBut">Show Error info</button><div class="ui-helper-hidden ui-corner-all ui-widget-content AjaxErrorDet"></div></div>';
	var errD = $(errHtml);
	
	if(typeof(err)=="string") {
		ajaxO.ThrowenErrorMessage = err;
	}
	
	$(".AjaxErrorDet",errD).text(JSON.stringify(ajaxO));
	errD.dialog({modal:true,width: 600});
}

google.load('search', '1', {language : 'en', style : google.loader.themes.MINIMALIST});
var gCSE;
google.setOnLoadCallback(function() {
	gCSE = new google.search.CustomSearchControl('008173687613547743815:wowhh2gowce');
    gCSE.setResultSetSize(google.search.Search.SMALL_RESULTSET);
    var drawOptions = new google.search.DrawOptions();
    drawOptions.setInput(document.getElementById('SearchInput'));
    
    //search results:
    gCSE.setSearchCompleteCallback(window,function() {
    	$("#SearchResults").dialog("open");
    });
    //open in this window:
    gCSE.setLinkTarget(google.search.Search.LINK_TARGET_SELF)
    //draw:
    gCSE.draw('SearchResults',drawOptions);
  	
}, true);
function executeSearch() {
	gCSE.execute();
}
$(function() {
	$.history.init(Asine.stateChanged,{decode:false,unescape:true});
	//loading config:
	Asine.Config.load();
	$("#SearchResults").dialog({autoOpen:false,width: 700,show:'slide',modal:true,hide:'fade'});
	
	$("#DoSearch").button().click(executeSearch);
	$("#SearchInput").keypress(function(e) {
		if(e.which == 13) {
			executeSearch();
		}
	});
	$("#AjaxErrorDetBut").click(function() {
		$("#AjaxErrorDet").show('slide');
		$(this).fadeOut();
	});
	$("#AjaxError").ajaxError(AsineGlobalError);
	
	$("#MenuBar a,a.ajaxurl[href]").live('click',function(e) {
		if(Asine.Config.current.Ajax) {
			var prefix = "/main?";
			var anch = $(this);
			var url = anch.attr("href");
			if(url.indexOf(prefix)==0) {
				url = url.substring(prefix.length);
				window.location.hash = url;
				e.preventDefault();
				return false;
			}
		}
	});
	
	//Animations Toggle:
	$("#ChkAnim").attr("checked",Asine.Config.current.Animations);
	$("#ChkAnim").button({label:"Animations"}).click(function() {
		Asine.Config.current.Animations = (Asine.Config.current.Animations != true);
		Asine.Config.apply();
	});
	//Ajax Toggle:
	$("#ChkAjax").attr("checked",Asine.Config.current.Ajax);		
	$("#ChkAjax").button({label:"Ajax"}).click(function() {
		Asine.Config.current.Ajax = !Asine.Config.current.Ajax;
		Asine.Config.apply();
	});
	//Settings:
	var settings = $("#BrowsingOptions");
	settings.dialog({
		autoOpen:false,
		width:"400px",
		buttons: {
			OK : function() {
				settings.dialog('close');
			}
		},
		modal:true,
		show: 'fade',
		hide: 'fade'});
	$("#OpenSettings").button().click(function() {
		settings.dialog("open");
	});
	
	
	var menu = $("#MenuBar > ul").hide();
	AsineMenu(menu);
	menu.show();
	jQuery.validator.addMethod("placeholder", function(value, element, params) { 
		var plc = $(element).attr("placeholder");
		return (!plc) || (value != plc); 
	}, jQuery.format("Please enter the a value for {0} + {1}"));
	
});
