﻿var ajaxtarget;
var ajaxcallinprogress = false;
var ajaxcallstack = new Array();

function InsertAjax(url, target, parameters, optionaltarget) {
    if (typeof (target) != "function") {
        setLoadingDiv(target);
    }
    else if (optionaltarget) {
        setLoadingDiv(optionaltarget);
    }
    if (ajaxcallinprogress) {
        ajaxcallstack.push([url, target, parameters]);
        return;
    }
    
    ajaxcallinprogress = true;
    ajaxtarget = target;
    if (!parameters || parameters.length == 0) {
        NormalAjaxCall(url, target);
    }
    else {
        PostAjaxCall(url, target, parameters);
    }

}

function PostAjaxCall(url, target, parameters) {
    xmlhttp = false;
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
        xmlhttp = new XMLHttpRequest();
        if (xmlhttp.overrideMimeType) {
            // set type accordingly to anticipated content type
            //xmlhttp.overrideMimeType('text/xml');
            xmlhttp.overrideMimeType('text/html');
        }
    } else if (window.ActiveXObject) { // IE
        try {
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) { }
        }
    }
    if (!xmlhttp) {
        alert('Cannot create XMLHTTP instance');
        return false;
    }
    xmlhttp.onreadystatechange = stateChange;
    xmlhttp.open('POST', url, true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    try {
        xmlhttp.setRequestHeader("Content-length", parameters.length);
        xmlhttp.setRequestHeader("Connection", "close");
    }
    catch (Error) { }
    xmlhttp.send(parameters);
}

function NormalAjaxCall(url, target)
{
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = stateChange;
        xmlhttp.open("GET", url, true);
        xmlhttp.send(null);
    }
    else {// code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        xmlhttp.onreadystatechange = stateChange;
        xmlhttp.open("GET", url, true);
        xmlhttp.send();
    }
}

function stateChange() {
    if (xmlhttp.readyState == 4) {
        if (xmlhttp.status == 200) {
            // process whatever has been sent back here
            if (typeof (ajaxtarget) == "function")
            {
                ajaxtarget();
            }
            else
            {
                ajaxtarget.innerHTML = xmlhttp.responseText;
            }
        }
        else {
            alert("There was a problem in the returned data");
        }
        ajaxcallinprogress = false;
        if (ajaxcallstack.length > 0) {
            var call = ajaxcallstack.pop();
            InsertAjax(call[0], call[1], call[2]);
        }
    }
}

function setLoadingDiv(element) {
    var loadinghtml = "<div style='position:relative'><img style='position:absolute; top:20px; left:20px;' class='qsloadingimage' src='skins/skin_1/customimages/ajax-loader.gif' />";
        loadinghtml += "<div style='visibility:hidden'>" + element.innerHTML + "</div>";
        loadinghtml += "</div>";
    element.innerHTML = loadinghtml;
}

function updateMiniCart()
{
    InsertAjax("x-minicartheader.aspx?randomnumber=" + Math.floor(Math.random() * 10000), document.getElementById("MiniCart"));
}

function ajaxifyAddToCartForm(form) {
    try {
        form.rel = form.onsubmit;
        if (form.action.indexOf("?")) {
            form.action += "&ajaxcall=true";
        }
        else
        {
            form.action += "?ajaxcall=true";
        }
        form.onsubmit = function() {
            if (this.rel()) {
                try {
                    MoveElementToElement($('productImage'), $('MiniCart'));
                }
                catch (err) { }
                PostAjaxForm(form);
            }
            return false;
        }
        var button = getElementsByClassName("AddToCartButton", "input", form)[0];
        button.rel = button.onclick;
        button.onclick = function() {
            
            this.parentNode.onsubmit();
            return false;
        }
    }
    catch (Error) {
        //should just post to cart.
    }
}

function PostAjaxForm(form) {
    var params = "";
    var inputs = form.getElementsByTagName("input");
    for (var i = 0; i < inputs.length; i++) {
        if (params != "" && params[params.length -1] != "&") {
            params += "&";
        }
        if (inputs[i].name != "" && inputs[i].value) {
            params += inputs[i].name + "=" +  escape(encodeURI(inputs[i].value));
        }
    }
    var selects = form.getElementsByTagName("select");
    for (var i = 0; i < selects.length; i++) {
        if (params != "" && params[params.length - 1] != "&") {
            params += "&";
        }
        if (selects[i].name != "") {
            var currentselect = selects[i];
            var currentselectvalue = currentselect[currentselect.selectedIndex].value;
            params += selects[i].name + "=" + escape(encodeURI(currentselectvalue));
        }
    }
    //alert(params);
    InsertAjax(form.action, updateMiniCart, params, document.getElementById("MiniCart"));
}

function getElementsByClassName(className, tag, elm){
	var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}

function MoveElementToElement(movingelement, targetelement) {
    try {
        var movedcopy = movingelement.clone();
        movedcopy.setStyle("position", "absolute");
        movedcopy.setStyle("z-index", "10000");
        movedcopy.inject(movingelement, 'before');
        movedcopy.makeDraggable();

        new Fx.Move(movedcopy, {
            relativeTo: targetelement,
            position: 'centerTop',
            duration: 800
        }).start();

        //movedcopy.tween('height', 0);
        movedcopy.get('tween', { property: 'height', duration: 1000 }).start(0);
    }
    catch (err) {
        //Handle errors here
    }
    
}
