var ajaxify_edit_links;
var onloadCalls = Array();
var NADROX = {};

if (typeof NADROX === "undefined" || !NADROX) {
    var NADROX = {};
}

NADROX.utils = {
	ajaxLinkAction : function(e){
		if(e){
			e.preventDefault();
		}
		/** récupère le href d'un lien ou celui d'un autre élément html**/
		callHref = ($(this).attr("action") || $(this).attr("href")|| $(this).attr("n4x:href") || this.attributes.href.nodeValue);
		
		target = callHref.replace(/.*#/,"#");
		link = this;
		if (this.tagName == "FORM"){
			NADROX.utils.ajaxCall(callHref,$(this).serialize());
		}else if (this.tagName == "SELECT"){
			callHref += "&" + this.name + "=" + $(this).val();
			NADROX.utils.ajaxCall(callHref,{});
		}else{
			NADROX.utils.ajaxCall(callHref,{});
		}
		return false;
		
	},
	ajaxCall : function (callHref, extraData){
		var href = callHref.split("?");
		if(typeof extraData == "object"){
			extraData = $.param(extraData);
		}
		if (typeof href[1] != "undefined"){
			// we must filter the page anchor form extradata if any. Else it is being merged width the last data
			var indexOfDiez = href[1].indexOf("#");
			
			if ( indexOfDiez !== -1 && indexOfDiez > href.indexOf("?")){
				extraData += href[1].substring(0,indexOfDiez );
			}else{
				extraData += href[1]; 
			}
			
			href = href[0];
		}else{
			href = href[0];
		}
		$.post(href,extraData, NADROX.utils.handleAjaxResponse,"json");
	},
	handleAjaxResponse : function(data){
		if (data == null){
			return false;
		}
		if (data.__responseType == "formSave"){
			NADROX.utils.formSave(NADROX.utils.formSaveResume, data);
		}else{
			
			if(data.__callback){
				NADROX.utils.responseCallbacks(data.__callback,true);
			}
			if(typeof data.__replace != "undefined" && data.__replace ){
				target.replaceWith(data.__html);
			}
			if (!data.__append){
				$(data.__target).html(data.__html);
			}
			else{
				$(data.__target).append(data.__html);
			}
			if (data.callback){
				if( callback instanceof Array){
					for(var i in callback){
						callback[i](data,link,data.__target);
					}
				}
				else{
					callback(data,link,data.__target);
					ajaxify_edit_links(data.__target, data.__append, callback);
				}
			}
			if(data.__callback){
				NADROX.utils.responseCallbacks(data.__callback,false);
			}
			NADROX.utils.ajaxify_edit_links(data.__target, data.__append,null);
		}
	},
	responseCallbacks: function(oCalls, mustBeBefore){
			if (  oCalls instanceof Array && oCalls.length > 0){
				for (var i in oCalls){
					if ((!mustBeBefore &&  (typeof oCalls[i].executeBefore == "undefined" || !oCalls[i].executeBefore)) || 
								(mustBeBefore && typeof oCalls[i].executeBefore != "undefined" && oCalls[i].executeBefore )){
						if (typeof oCalls[i].transactionId == "undefined"){
							window["NADROX"][oCalls[i].module][oCalls[i].func](oCalls[i].args);
						}else{
							window["NADROX"][ oCalls[i].transactionId ] = new window["NADROX"][oCalls[i].module][oCalls[i].func](oCalls[i].args);
						}
					}
				}
			}else if(oCalls instanceof Object){
				window[oCalls.func](oCalls.args);
			}
			
	},
	ajaxify_edit_links : function(container,append,callback){
		$((container ? container + " " :"body ") + ".fn-ajax-edit-link-dbl:not(form,select)").unbind("dblclick",NADROX.utils.ajaxLinkAction).dblclick(NADROX.utils.ajaxLinkAction);
		$((container ? container + " " :"body ") + ".fn-ajax-edit-link:not(form,select)").unbind("click",NADROX.utils.ajaxLinkAction).click(NADROX.utils.ajaxLinkAction);
		$((container ? container + " " :"body ") + "form.fn-ajax-edit-link").unbind("submit",NADROX.utils.ajaxLinkAction).submit(NADROX.utils.ajaxLinkAction);
		$((container ? container + " " :"body ") + "select.fn-ajax-edit-link").unbind("change",NADROX.utils.ajaxLinkAction).change(NADROX.utils.ajaxLinkAction);
	},
	redirect : function(args){
		if (typeof args.url != "undefined"){
			//on doit récupérer la valeur du tag base parce que IE7 n'en tien pas compte lors d'un redirect en URL relatif
			if (args.url.indexOf($("base").attr("href")) == -1){
				window.location.href = $("base").attr("href") + args.url;
			}else{
				window.location.href = args.url;
			}
		}else{
			window.location.href = window.location.href ;
		}
	},
	updateTabLink : function (args){
		//lorsque la zone de configuration change pour un nouveau type de section, Cette fonction met a jour les liens de localisation (tabs)
		//ceci permet de conserver le type de contenu sélectionné dans le html select
		$("#section-tabs-" + args.id + " a").each(function(){
			$(this).attr("href",$(this).attr("href").replace(/section_type=([0-9])*/,"section_type="+args.sectionType));
		});
	},
	updateSectionTypeLink : function (args){
		//lorsqu'on change la langue de configuration, cette fonction change la langue pour le select qui permet de changer de type de section
		//Ceci permet de charger immédiatement les informations correspondante a la langue sélectionnée
		$("#sitemap-" + args.id + " select[name=section_type]").each(function(){
			$(this).attr("n4x:href",$(this).attr("n4x:href").replace(/configLang=([a-z]){2}/,"configLang=" + args.configLang));
		});
	}
};
NADROX.utils.updateAjaxForms = function(){};
	NADROX.utils.formSave = function (form,data) {
			if (data.__responseType == "editLink"){
				/** 
				 * Dans le cas où on affiche un dialog avant le save définitif, la réponse sera structuré comme un ajax edit link
				 * On conserve donc le formulaire dans un objet et lorsque la réponse finale du formulaire sera retournée, cette
				 * fonction sera rappelée
				 */
				NADROX.utils.formSaveResume = form;
				NADROX.utils.handleAjaxResponse(data);
			}else{
				NADROX.utils.formSaveResume = null;
				//var formId = args[0]; // 'ipsum'
				var statusbox = $(".status",form);
				
				if (statusbox.length == 0){
					$(form).unbind("submit",NADROX.utils.formSave);
					return false;
				}
				
				
				$("input, select, textarea",form).removeClass("error-required").removeClass("error-validity");
				statusbox.empty();
		
				
				if(!data.ok){
					
					statusbox.animate({opacity: "0"},300,null,function(){
						statusbox.append("<div class='status-details'>" + data.message + "</div>")
						if ($(form).attr("titleTextEnabled")){
							$(".titleText",$(form)[0]).blur();
						}
						statusbox.addClass("status-error");
						for (var err in data) {
							if (!isNaN(err)){
								if(data[err].Required){
									err =  data[err].Required;
									errorClass = "error-required";
								}else{
									err =  data[err].Validity;
									errorClass = "error-validity";
								}
								field = $("#" + err.field,form);
								
								field.addClass(errorClass);
								
								statusbox.append("<div class='" + errorClass + "-msg'><label for='" + err.field + "'>" + err.msg + "</label></div>");
							}
						}
					});
					
					statusbox.animate({opacity:1},500,null,function(){
						var min_scroll_top = (statusbox.offset()).top - 40;	
						if ($("html").scrollTop() > min_scroll_top){
							$("html").animate({scrollTop: min_scroll_top},300);
						}	
					});
				}
				else{
					statusbox.append( data.message );
					statusbox.removeClass("status-error");
					statusbox.addClass("status-ok");
				}
				if (data.removeForm){
					//si on doit enlever le formulaire, on conserve la node de status
					var sb = statusbox.remove();
					$(form).css("height",$(form).height())
					$(form).animate({opacity:0},function(){
						$(form).empty();
						$(form).append(sb);
						$(form).animate({opacity:1});
						$(form).addClass("form-removed");
					});
					
				}
				if (typeof data.callback != "undefined" && data.callback.length > 0){
					NADROX.utils.responseCallbacks(data.callback,false);
				}
			}
	};
	NADROX.utils.eventAjaxFormSubmit = function(e){
		
		e.preventDefault();
		var form = this;
		/*	
		
		$.ajax({ 
	        type: "POST",
	        url: ($(form).attr("action")),
	        contentType: ($(form).attr("enctype") ? $(form).attr("enctype"):'application/x-www-form-urlencoded'),
	        data: $.toJSON($(form).serialize()),
	        dataType: "json",
	        success: function(data){
	        	NADROX.utils.formSave(form,data);
	          }
	    });*/   
		
		$.post($(this).attr("action"),$(form,form).serialize(),function(data){NADROX.utils.formSave(form,data)},"json");
		//node.set("innerHTML","Saving...");
	};
	NADROX.utils.setFocus = function(args){
		$(args.selector).focus();
	}
	NADROX.utils.toggleBlockEvent = function (e){
		e.preventDefault();
		toggleBlock(this);
	};
	NADROX.utils.toggleBlock = function(el,forceClose){
		if ($(el).hasClass("fn-toggle-next-opened") || forceClose){
			$(el).next().css("display","none");
			$(el).removeClass("fn-toggle-next-opened");
			$(el).addClass("fn-toggle-next-closed");
		}
		else{
			$(el).next().css("display","block");
			$(el).removeClass("fn-toggle-next-closed");
			$(el).addClass("fn-toggle-next-opened");
		}
	};
	NADROX.utils.initToggleBlock = function(){
		$(".fn-toggle-next").each(function(node,index,nodeList){
			if($(this).hasClass("fn-toggle-next-closed")){
				toggleBlock(this,true);
			}else{
				toggleBlock(this,false);		
			}
			$(this).unbind("click",toggleBlockEvent).click(toggleBlockEvent);
			$(this).css("cursor","pointer");
		});
		
	};
	NADROX.utils.updateAjaxForms = function(){
		$("form.fn-ajax").unbind("submit", NADROX.utils.eventAjaxFormSubmit).
			submit( NADROX.utils.eventAjaxFormSubmit);
	};
	
	/**
	 * Généère un overlay basé sur un contenu du DOM
	 * args.target : sélecteur css sur l'élément du DOM à mettre dans l'overlay
	 * args.useCSS : le positionnement est géré par css
	 */
	NADROX.utils.createOverlay = function(args){
		var inst = this;
		this.centerOverlay = function(){
			inst.settings.container[0].style.marginLeft = "-" + (inst.settings.width/2) + inst.settings.units;
			inst.settings.container[0].style.marginTop = "-" + (inst.settings.container.outerHeight() /2) + "px";
		};
		inst.settings = {
			overlayMode	: "useDom", /**** Options disponibles
									useDom -> change le style de [target] pour qu'elle s'affiche au centre, sans la retirer de son contexte 
									useDomDetached -> deplace [target] a la fin du body pour l'ouvrir dans l'overlay 
									copyNode -> fait une copie de [target] dans l'overlay, la la fin du body
									newNode -> cré un overlay a la fin du body, en utilisant créant une [newNode] comme container 
									******/
			overlayId	: null, //si string, défini l'id de l'overlay
			useCss		:false, //si TRUE, laisse le css se charger du positionnement
			onClose 	:null, //Fonctiona a exécuter à la fermeture de l'overlay recois comme argument le target et l'évènement click de la fermeture
			noClose 	:false, //si TRUE, rend la fermeture de l'overlay impossible à l'utilisateur
			preserveOnClose :false, //si false ou si overlayMode == "newNode", supprime la node à la fermeture
			target		:"#", //élément à placer en overlay
			wrapperClass : "",
			overlayAnimateDelay: 300,
			scrollTop: -1, //si positif , donne le X auquel il faut scroller sur le show à partir du top
			zIndex		: 15
		};
		
		$.extend(inst.settings, args);
		inst.settings.target = $(inst.settings.target);
		
		if (inst.settings.overlayMode != "newNode"){
			if (inst.settings.overlayMode == "useDomDetached"){
				inst.settings.target.wrap("<div id='overlay-content-placeholder' />");
				inst.settings.target.detach().appendTo("body");
			}else if (inst.settings.overlayMode == "copyNode"){
				inst.settings.target = $(inst.settings.target.clone().appendTo("body"));
		
			}
			inst.settings.container = inst.settings.target;
			inst.settings.container.addClass("shownOverlay");
		}else{
		
			var nodeWrapper = $(document.createElement("div"));
			var nodeContent = $(document.createElement("div"));
			nodeWrapper.append(nodeContent);
			nodeWrapper.addClass("overlay-wrapper");
			if (inst.settings.wrapperClass){
				nodeWrapper.addClass(inst.settings.wrapperClass);
			}
			nodeContent.addClass("overlay-content");
			var newNode = $(document.createElement("div"));
			if (inst.settings.overlayId != null){
				newNode.attr("id", inst.settings.overlayId );
			}else{
				newNode.attr("id", "overlay-box" );
			}
			nodeContent.append(newNode);
			nodeWrapper.appendTo("body");
			inst.settings.target = newNode;
			inst.settings.container = nodeWrapper;
			inst.settings.content = nodeContent;
		}
		
		if(!inst.settings.useCSS) {
			inst.settings.container.css("position","fixed")
					.css("left","50%")
					.css("width","" + args.width + args.units)
					.css("top","50%")
					.css("background-color","#fff");
			this.centerOverlay(inst.settings.container);
		}
		inst.settings.container[0].style.zIndex = inst.settings.zIndex;
		if ($.browser.msie == 0 || $.browser.msie > 8){
			$(inst.settings.container).css("opacity",0);
		}else{
			$(inst.settings.container).css("display","none");
		}
		
		inst.overlayShade = document.createElement("div");
		inst.overlayShade.style.height= "100%";
		inst.overlayShade.className = "overlay-shade";
		inst.overlayShade.style.position= "fixed";
		inst.overlayShade.style.width= "100%";
		inst.overlayShade.style.top= "0";
		inst.overlayShade.style.left= "0";
		inst.overlayShade.style.zIndex= inst.settings.container[0].style.zIndex -1;
		inst.overlayShade.style.backgroundColor= "#000";
		$(inst.overlayShade).css("opacity",0);
		inst.overlayShade  = document.body.appendChild(inst.overlayShade);
		
		this.handleEscape = function(e){
			if (e.keyCode == 27){
				inst.closeOverlay(e);
			}
		}
		this.closeOverlay = function(e){
			if (typeof inst.settings.noClose == "undefined" || !inst.settings.noClose){
				$(inst.aOverlayClose ).remove();
			}
			$(document.documentElement).unbind("keydown",inst.handleEscape);
			$(inst.overlayShade).animate({"opacity":0},inst.settings.overlayAnimateDelay,function(){
						$(inst.overlayShade).remove();
						if(!inst.settings.preserveOnClose || inst.settings.overlayMode  == "newNode") {
							inst.settings.container.remove();
						}else{
							inst.settings.target.removeClass("shownOverlay");
							//inst.settings.target.attr("style","");
							if (inst.settings.overlayMode == "useDomDetached"){
								inst.settings.target.detach().insertAfter("#overlay-content-placeholder");
								
								$("#overlay-content-placeholder").remove();
							}
						}
				        if (inst.settings.onClose){
				        	if($.isFunction(inst.settings.onClose)) {
				        		inst.settings.onClose();
				        	} else {
				        		NADROX.utils.callFromString(inst.settings.onClose)(e, inst.settings.target);
				        	}
				        }
					});
			if ($.browser.msie == 0 || $.browser.msie > 8){
				$(inst.settings.container).animate({"opacity":0},inst.settings.overlayAnimateDelay);
			}else{
				$(inst.settings.container).css("display","none");
			}
		
		}

		if (typeof inst.settings.noClose == "undefined" || !inst.settings.noClose){
			$(document.documentElement).keydown(inst.handleEscape);
			inst.aOverlayClose = document.createElement("a");
			inst.aOverlayClose.innerHTML="X";
			$(inst.aOverlayClose).click(inst.closeOverlay);
			inst.aOverlayClose.className  = "overlay-close";
			$(inst.aOverlayClose).attr('title', 'Close');
			
			
			inst.settings.container.append(inst.aOverlayClose);
		}
		var item = null;
		if(!inst.settings.useCSS) {
			if (inst.settings.content != null){
				item = inst.settings.content[0];
			}else{
				item = inst.settings.target[0];
			}
			if (!$.browser.msie || ($.browser.msie && $.browser.version > 8)){
				if(item.style.boxShadow != null){
					item.style.boxShadow = "2px 3px 16px 1px rgba(0,0,0,.8)";
				}
				if(item.style.MozBoxShadow != null){
					item.style.MozBoxShadow = "2px 3px 16px 1px rgba(0,0,0,.8)";
				}
				if(item.style.WebkitBoxShadow != null){
					item.style.WebkitBoxShadow = "2px 3px 16px 1px rgba(0,0,0,.8)";
				}
			}
		}
		
		$(inst.overlayShade).animate({opacity:"0.5"},inst.settings.overlayAnimateDelay);
		if ($.browser.msie == 0 || $.browser.msie > 8){
			$(inst.settings.container).animate({opacity:"1"},inst.settings.overlayAnimateDelay);
		}else{
			$(inst.settings.container).css("display","block");
		}
		
		if (inst.settings.scrollTop != -1){
			$("html").animate({scrollTop: inst.settings.scrollTop},1000);
		}
		return {settings : inst.settings, 
				centerOverlay: function(){
								inst.centerOverlay();
				},
				close: function(){
					inst.closeOverlay();
				}
		}
	};


/**
 * Permet d'appeler une fonction de facon sécuritaire à partir d'une string
 * en décortiquant l'appel et en retournant un pointeur sur la dernière partie 
 * de l 'appel.
 * Exemple : NADROX.utils.callFromString("NADROX.utils.createOverlay")(settings);
 */
NADROX.utils.callFromString = function(strFuncCall){
	funcPart = strFuncCall.split('.');
	obj = window;
	for(var i =0; i < funcPart.length -1 ; i++){
		obj = obj[funcPart[i]];
	}
	return obj[funcPart[i]];
}
//test = function(){ eval('test = new FileBrowser.init("fileEditor",\'{"ResultSet":{"Result":["galleries"]},"__html":"","__target":"","__append":false,"__callback":null}\')') }();

// Casse JQuery -- Sais pas pourquoi !
/*Object.prototype.is_array = function() {   
    return this && !(this.propertyIsEnumerable('length')) && typeof this === 'object' && typeof this.length === 'number';
};*/

/**
 * Exemple d'utilisation du format()
 * console.debug('avec un array: ' + "test {0} {1}".format([5,6])); // "avec un array: test 5 6"
 * console.debug('avec 2 args: ' + "test {0} {1}".format(2, 'replace')); // "avec 2 args: test 2 replace" 
 * console.debug('avec un objet: ' + "test {x} {y}".format({x:'qui',y:'fonctionne!'})); // "avec un objet: test qui fonctionne!"
**/
String.prototype.format = function(){
	var str = this;
	var argLen = arguments.length;
	// Aucun argument, rien à faire, retourne
	if(argLen == 0) {return this;};
	// 1 argument Objet ou Array
	if(argLen == 1 && (typeof(arguments[0]) == 'object' || $.isArray(arguments[0]))){
		// Si c'est un array, boucle et remplace les valeur X par l'index correspondant dans le array
		// console.debug('isarray? '+arguments[0].is_array());
		if($.isArray(arguments[0])) {
			for(var i=0; i<arguments[0].length; i++){
			    str = str.replace('{'+(i)+'}',arguments[0][i]);
			}
		// Si c'est un objet, boucle et remplace les {key} par la valeur la propriété correspondante dans l'objet
		} else if (typeof(arguments[0]) == 'object') {
			var o = arguments[0];
			for (var key in o) {
		        if (o.hasOwnProperty(key)) {
		        	str = str.replace('{'+key+'}', o[key]);
		        }
		    }
		}
	} else {
		for(var i=0; i<arguments.length; i++){
		    str = str.replace('{'+(i)+'}',arguments[i]);
		}
	}
	return str;
};

function range(low, high, step) {

    var ar = [],
		fn = 'push',
		alpha  = false;
	
	step = Math.abs(step || 1);

	if(alpha = (isNaN(low) && isNaN(high))) {
		low = low.charCodeAt(0);
		high = high.charCodeAt(0);
	} else if (isNaN(low) || isNaN(high)) {
		low = (isNaN(low) ? 0 : low);
		high = (isNaN(high) ? 0 : high);
	}

	if(low > high) {
		fn = 'unshift';
		var s = low; low = high; high = s;
	}
	
	while(low <= high) {
		ar[fn]((alpha ? String.fromCharCode(low) : low));
		low += step;
	}

    return ar;
}
function _trace(){
	if(typeof console != "undefined" && console.log) {
		for(var i=0; arguments[i]; i++) {
			console.log(arguments[i]);
		}
	}
}
$(document).ready(function(){
	NADROX.utils.updateAjaxForms();
	NADROX.utils.initToggleBlock();

	for (var func in onloadCalls){
		onloadCalls[func]();
	}
	
});

NADROX.utils.titleText = function(form){
	$(form).attr("titleTextEnabled","true");
	$(".titleText",$(form)[0]).focus(function(){
        if ($(this).val() == $(this)[0].title)
        {
            $(this).removeClass("titleTextActive",$(form)[0]);
            $(this).val("");
        }
    });
    
    $(".titleText",$(form)[0]).blur(function()
    {
        if ($(this).val() == "")
        {
            $(this).addClass("titleTextActive",$(form)[0]);
            $(this).val($(this)[0].title);
        }
    });
    
    $($(form)[0]).submit(function() {
    	$(".titleTextActive").each(function() {
    		if($(this).val() == this.title) {
    			$(this).val("");
    		}
    	});
    });
    $(".titleText",$(form)[0]).blur();
};

NADROX.utils.dialogBindEvents = function(args){
	var btns = $(args.dialogId + " .choices a:not(.fn-normal-link)");
	//console.dir(btns);
	btns.unbind("click",NADROX.utils.dialogClickEvent).click(args,NADROX.utils.dialogClickEvent);
	var btDefault = btns.filter(".btnDefault");
	if(btDefault) $(btDefault).focus();
};
NADROX.utils.dialogClickEvent = function(e){
	e.preventDefault();
	window["NADROX"][e.data.dialogInstance].close();
};

NADROX.utils.submitButtons = function(root){
	if (typeof root =="undefined"){
		root = document.body;
	}else{
		root = $(root)[0];
	}
	$("a.fn-submit, a.mce_save",root).unbind("click",NADROX.utils.__submitButtons).click(NADROX.utils.__submitButtons);
	$("select.fn-submit",root).unbind("change").change(function(){$(this.form).trigger("submit")});
}

NADROX.utils.__submitButtons = function(e){
	
	e.preventDefault();
	var form = $(this).parents("form:first")[0];
	var action = $("input[name=action]", form);
	var oldAction = action.val();
	if (typeof this.rel != "undefined"){
		action.val(this.rel);
	}
//	$(form).unbind("submit",NADROX.edit.saveCallback).submit(NADROX.edit.saveCallback);
	$(form).trigger("submit");
	if (typeof this.rel != "undefined"){
		action.val(oldAction);
	}
}
/**
 * Création du workspace NADROX.basket s'il n'existe pas
 */
if (typeof NADROX.basket === "undefined" || !NADROX.basket) {
    NADROX.basket = {
    	setTotalItemCount: function(args) {
    		if(args.itemCount) {
    			$(".fn-basket-total-item-count").html(args.itemCount);
    			$(".fn-cart-access-button").removeClass("empty-cart");
    		} else {
    			$(".fn-cart-access-button").removeClass("empty-cart");
    		}
    	},
    	updateOverlaySubTotal: function(args) {
    		$('#qtyOverlay #qty').unbind('change').change(function(){
    		    $('#qtyOverlay .amount').html(function(index, oldHtml) {
    		    	var prefix = sufix = "";
    		    	if(args.lang == 'fr') suffix = " $";
    		    	else prefix = "$";
    		    	return prefix+((parseFloat($('#qtyOverlay #qty option:selected').val())*args.value).toFixed(2))+suffix;
    		    });
    		});
    	}
    };
}
