function Cool() {

    // alert( window.location.href.replace(/#.*/, ""));

    return false;


}

function HideShow_Product(productid) {
    var checked = $("#chkHideFromSales").attr('checked');
    $('#spanHFSLoading').html('Saving...');
    var urlin = '/Ajax.aspx/UpdateContent/Mrn_Products/is_hidden_from_sales/product_id/' + productid + '/' + (checked == true ? 'True' : 'False');
    $.ajax({
        type: "POST",
        url: urlin,
        data: {
    },
    cache: false,

    success: function(msg) {
        $('#spanHFSLoading').html("");
        if (msg != "True" && msg != "False") {
            // $('#spanHFSLoading').html('Failed to update!  ' + msg); 
            ShowColorBox(msg)
        }
        else {
            //  $('#spanHFSLoading').html('Updated..'); 
            ShowColorBox("Updated");
        }
    }
});


}




function NewsImageChangeEnable(NewsID, ButtonID, ajaxfile) {
    $(document).ready(function() {
        new AjaxUpload('#' + ButtonID + '', {
            //action: 'upload.php',
            action: ajaxfile, // I disabled uploads in this example for security reaaons
            data: {

                'key2': "be send because",
                'key3': "we will overwrite it"
            },
            onSubmit: function(file, ext) {
                //if (ext && new RegExp('^(' + allowed.join('|') + ')$').test(ext)){
                if (ext && /^(jpg|png|jpeg|gif)$/.test(ext)) {
                    /* Setting data */
                    this.setData({
                        'key': 'This string will be send with the file'
                    });

                    $('#EI' + NewsID).attr("src", "/images/other/loading.gif")
                } else {

                    // extension is not allowed
                    ShowColorBox('Error: only images are allowed');
                    // cancel upload
                    return false;
                }

            },
            onComplete: function(file, ext) {
                $('#EI' + NewsID).attr("src", "/newsicon/" + ext)

            }
        });
    });

}


function ImageBlockChange(PageID, BlockID, width, height, ajaxfile) {

    $(document).ready(function() {
        new AjaxUpload('#' + BlockID + '', {
            //action: 'upload.php',
            action: ajaxfile, // I disabled uploads in this example for security reaaons
            data: {

                'key2': "be send because",
                'key3': "we will overwrite it"
            },
            onSubmit: function(file, ext) {


                //if (ext && new RegExp('^(' + allowed.join('|') + ')$').test(ext)){
                if (ext && /^(jpg|png|jpeg|gif)$/.test(ext)) {
                    /* Setting data */
                    this.setData({
                        'key': 'This string will be send with the file'
                    });


                    $('#' + BlockID).attr("src", "/images/other/loading.gif")




                } else {

                    // extension is not allowed
                    ShowColorBox('Error: only images are allowed');
                    // cancel upload
                    return false;
                }

            },
            onComplete: function(file, ext) {

                $('#' + BlockID).attr("src", "/BlockImage/" + ext)


            }
        });
    });

}


function ChangePageAlias(url, PageID, NewID, loadhere) {

    $("#" + loadhere).html("<center>Saving...</center>")

    $.ajax({
        type: "POST",
        url: url,
        data: {
            PageID: PageID,
            NewID: NewID

        },

        cache: false,

        success: function(msg) {
            if (msg != "done") {
                ShowColorBox(msg);
            }
            else {
                $("#" + loadhere).html("")
                ShowColorBox("New page alias updated");
            }

        }

    });

}

function UserActivateAll(url) {


    if (confirm("Are you sure you want to activate all pending users")) {

        $("#User_Saving").html("<img align='absmiddle' src='/images/other/loading.gif'> Saving ...");

        $.ajax({
            type: "POST",
            url: url,
            data: {

        },

        cache: false,

        success: function(msg) {

            $("#User_Saving").html("");

        }

    });
}
}

function PageSettingsSection(ID, url, loadhere) {


    $("#" + loadhere).html("<center>Loading...</center>")

    $.ajax({
        type: "POST",
        url: url + ID,
        data: {
    },

    cache: false,

    success: function(msg) {
        $("#" + loadhere).html(msg)
    }

});

}


function PageSettingsSales(ID, url, loadhere) {


    $("#" + loadhere).html("<center>Loading...</center>")

    $.ajax({
        type: "POST",
        url: url + ID,
        data: {
    },

    cache: false,

    success: function(msg) {
        $("#" + loadhere).html(msg)
    }

});

}


function Search(searchstring) {

    location.href = "/Marren.aspx/Search?q=" + searchstring;

}
$(window).ready(function() {
    $('#SearchText').keydown(function(event) {
        if (event.keyCode == 13) {
            Search($('#SearchText').val());
        }
    });
    $('#LoginPassword').keydown(function(event) {
        if (event.keyCode == 13) {
            document.getElementById('loginform').submit();
        }
    });
    $('#LoginEmail').keydown(function(event) {
        if (event.keyCode == 13) {
            document.getElementById('loginform').submit();
        }
    });
});
function RearrangeSales(MoveType, BranchID, NewOrder) {
    //  alert(MoveType + "," + BranchID + "," + NewOrder)

    $("#Reorder_Saving").html("<img align='absmiddle' src='/images/other/loading.gif'> Saving ...");
    $.ajax({
        type: "POST",
        url: "/Reorder.aspx/Process/" + MoveType + "/" + BranchID + "/" + NewOrder,
        data: {
    },

    cache: false,

    success: function(msg) {
        $("#Reorder_Saving").html("");


    }

});

}

function ShowColorBox(Message) {

    frame = "<center><img src='/images/other/marren_logo_white.jpg'><br><br><span style='font-size:12px;padding:25px;'>" + Message + "</span></center>";


    $.fn.colorbox({
        width: 600,
        height: 300,
        //        initialWidth: 500,
        //        initialHeight: 500,


        html: frame

    });


}

function RemoveText(defaulttext, id) {
    if ($(id).attr("value") == defaulttext) {
        $(id).attr("value", "");
    }
}
function ResetText(defaulttext, id) {
    if ($(id).attr("value") == "") {
        $(id).attr("value", defaulttext);
    }
}



/************************************/
function tabSwap(whichtab) {
    //   $.tabs('product_spec', whichtab)
    $('#product_spec').triggerTab(parseInt(whichtab));

}

function SendServiceRequest(url, fullname, SiteName, Address, postcode, telephonenumber, emailaddress, makemodel, faultdescription) {
    $("#ServiceRequest_loading").text("Please wait....");
    $.ajax({
        type: "POST",
        url: url,
        data: {
            fullname: fullname,
            SiteName: SiteName,
            Address: Address,
            postcode: postcode,
            telephonenumber: telephonenumber,
            emailaddress: emailaddress,
            makemodel: makemodel,
            faultdescription: faultdescription
        },

        cache: false,

        success: function(msg) {
            if (msg != "done") {

                $("#ServiceRequest_loading").text("");
                ShowColorBox(msg)
            }
            else {
                $("#ServiceRequest_loading").text("");
                ShowColorBox("A request has been sent, a member of our team will contact you shortly.");
            }

        }
    });

}

/************* Password *************/

function RecoverPassword(emailid, url) {

    $("#Password_loading").text("Please wait...");

    $.ajax({
        type: "POST",
        url: url + "/" + emailid,
        data: {
    },

    cache: false,

    success: function(msg) {
        if (msg != "done") {

            $("#Password_loading").text("");
            ShowColorBox(msg)
        }
        else {
            $("#Password_loading").text("");
            ShowColorBox("Your password is sent to the email address");
        }

    }

});
}

/********* User management ************/
function DeleteUser(userID, url, obj) {
    if (confirm("Are you sure you want to delete this user?")) {
        $.ajax({
            type: "POST",
            url: url,
            data: {
        },

        cache: false,

        success: function(msg) {
            if (msg != "done") {
                ShowColorBox(msg)
            }
            else {
                $(obj).parent().parent().parent().remove();
            }

        }

    });
}
}


function GetSingleUser(userID) {

    $.ajax({
        type: "POST",
        url: "/User.aspx/GetsingleUser/" + userID,
        data: {
    },

    cache: false,

    success: function(msg) {
        $("#UserBlock_" + userID).html(msg);

    }

});
}

function UserUpdateStatus(userid, newstatus) {
    url = "/User.aspx/UpdateStatus/";

    if (confirm("Are you sure you want to update status")) {

        $("#User_Saving").html("<img align='absmiddle' src='/images/other/loading.gif'> Saving ...");

        $.ajax({
            type: "POST",
            url: url + userid + "/" + newstatus,
            data: {

        },

        cache: false,

        success: function(msg) {

            $("#User_Saving").html("");

        }

    });
}
}



/*************** Page management ****************/
function Rearrange(TabNode, NewOrder) {
    //   alert(TabNode + NewOrder);

    $("#Pages_Saving").html("<img align='absmiddle' src='/images/other/loading.gif'> Saving ...");

    $.ajax({
        type: "POST",
        url: "/Page.aspx/ReArrange/" + TabNode + "/" + NewOrder,
        data: {
    },

    cache: false,

    success: function(msg) {
        $("#Pages_Saving").html("");

    }

});

}

function PageReorder(Node1, Node2, type) {
    $.ajax({
        type: "POST",
        url: "/Page.aspx/Reorder/" + Node1 + "/" + Node2 + "/" + type,
        data: {
    },

    cache: false,

    success: function(msg) {
        //  alert(msg);

    }

});
}

function PageDelete(pageid) {

    $("#Pages_Saving").html("<img align='absmiddle' src='/images/other/loading.gif'> Please wait ...");

    $.ajax({
        type: "POST",
        url: "/Page.aspx/DeletePage/" + pageid,
        data: {
    },

    cache: false,

    success: function(msg) {
        $("#Pages_Saving").html("");

    }

});

}


function ChangeNavigationTitle(NewName, page) {

    $("#Pages_Saving").html("<img align='absmiddle' src='/images/other/loading.gif'> Saving ...");
    $.ajax({
        type: "POST",
        url: "/Ajax.aspx/UpdateContent/Mrn_Pages/navigation_title/page_id/" + page + "/" + NewName,
        data: {
    },

    cache: false,

    success: function(msg) {
        $("#Pages_Saving").html("");
    }

});


}

function ChangeTemplate(template, page, url) {

    if (confirm("Are you sure you want to change this page's template ?")) {
        $("#Pages_Saving").html("<img align='absmiddle' src='/images/other/loading.gif'> Saving ...");
        $.ajax({
            type: "POST",
            url: url + "/" + template,
            data: {
        },

        cache: false,

        success: function(msg) {
            $("#Pages_Saving").html("");
            ShowColorBox("Template changed")
        }

    });
}

}

function PageSettings(pageID, url, loadhere) {

    $("#" + loadhere).html("<center>Loading...</center>")

    $.ajax({
        type: "POST",
        url: url + pageID,
        data: {
    },

    cache: false,

    success: function(msg) {
        $("#" + loadhere).html(msg)
    }

});

}

function LoadDivToDiv(from, to) {

    $("#" + to).html($("#" + from).html())
}




function AddNewPage(PageName, Template, Tab, url, reloadurl) {

    $("#Pages_Saving").html("<img align='absmiddle' src='/images/other/loading.gif'> Saving ...");

    $.ajax({
        type: "POST",
        url: url + "/" + PageName + "/" + Template + "/" + Tab,
        data: {
    },

    cache: false,

    success: function(msg) {
        //  $("#" + loadhere).html(msg)
        if (msg != "done") {
            ShowColorBox(msg);
        }
        else {
            $("#Pages_Saving").html("");
            GetTabsAndpages(reloadurl, 'TabsAndPages')
        }
    }

});
}

function GetTabsAndpages(url, loadhere) {


    $.ajax({
        type: "POST",
        url: url,
        data: {
    },

    cache: false,

    success: function(msg) {
        $("#" + loadhere).html(msg)

    }

});
}




/****************************************/

function DeleteBrand(BrandID) {

    url = "/Brand.aspx/Delete/" + BrandID;

    if (confirm("Are you sure you want to delete this brand ?")) {

        $.ajax({
            type: "POST",
            url: url,
            data: {
        },

        cache: false,

        success: function(msg) {

            if (msg != "done") {

                ShowColorBox(msg)

            }
            else {

                location.href = "/Sales.aspx/Brands/Edit/All";
            }

        }

    });
}


}

/************** Spares excel upload**************************/

function SyncWithDataBase(url) {



    $("#LoadingExcel").html("<img align='absmidle' src='/images/other/loading.gif'> Syncing database ...")

    $.ajax({
        type: "POST",
        url: url,
        data: {
    },

    cache: false,

    success: function(msg) {

        $("#LoadingExcel").html("");
        ShowColorBox(msg)
    }

});
}


function EnableUploadExcel(ProductID, ButtonID, ajaxfile, syncajaxfile) {
    $(document).ready(function() {
        new AjaxUpload('#' + ButtonID + '', {

            action: ajaxfile,
            data: {

                'key2': "be send because",
                'key3': "we will overwrite it"
            },
            onSubmit: function(file, ext) {

                if (ext && /^(xlsx|xls)$/.test(ext)) {

                    this.setData({
                        'key': 'This string will be send with the file'
                    });

                    $("#LoadingExcel").html("<img align='absmidle' src='/images/other/loading.gif'> Uploading file ...")
                } else {

                    // extension is not allowed
                    ShowColorBox("Error: Only excel files are allowed");
                    // cancel upload
                    return false;
                }

            },
            onComplete: function(file, ext) {

                SyncWithDataBase(syncajaxfile)



            }
        });
    });

}





/************* Product Delete ***********/

function ProductDelete(ProductID, CategoryID) {



    url = "/Product.aspx/Delete/" + ProductID + "/" + CategoryID;

    if (confirm("Are you sure you want to delete this product from this category")) {

        $.ajax({
            type: "POST",
            url: url,
            data: {
        },

        cache: false,

        success: function(msg) {

            if (msg != "done") {

                ShowColorBox(msg)

            }
            else {
                $("#BLOCK_" + ProductID).slideUp();
                //  location.reload(true);
            }

        }

    });
}


}


/********** News ******************/

function DeleteNews(NewsID, url) {
    if (confirm("Are you sure you want to delete this news")) {

        $.ajax({
            type: "POST",
            url: url,
            data: {
        },

        cache: false,

        success: function(msg) {

            if (msg != "done") {

                ShowColorBox(msg)

            }
            else {

                $("#NewsList_" + NewsID).slideUp();
            }

        }

    });
}
}


function LoadSingleNews(NewsID, url, loadhere) {

    $('#NewNewsForm').slideUp()

    $("#" + loadhere).html("<center><br><img src='/images/other/loading.gif'><br> <br></center>");

    $.ajax({
        type: "POST",
        url: url,
        data: {
    },

    cache: false,

    success: function(msg) {

        $("#" + loadhere).html(msg);

    }

});

}


function OpenNewNewsForm() {

    $("#Container").html("");

    $('#NewNewsForm').slideDown()
    //New_NewsContent

    var configArray = [{
        theme: "advanced",
        mode: "none",
        language: "en",
        width: 800,
        height: 250,
        theme_advanced_layout_manager: "SimpleLayout",
        theme_advanced_toolbar_location: "top",
        theme_advanced_toolbar_align: "left",
        theme_advanced_buttons1: "save,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull",
        theme_advanced_buttons2: "cut,copy,paste,pastetext,|bullist,numlist,code",
        theme_advanced_buttons3: ""
}]

        tinyMCE.settings = configArray[0];

        tinyMCE.execCommand('mceAddControl', false, 'New_NewsContent');
    }

    function NewsAdd(Title, ContentDivID, url, loadhere) {

        var Content = tinyMCE.get(ContentDivID).getContent()

        $("#NewNewsForm").hide();
        $("#" + loadhere).html("<center><br>Saving ...<br><img src='/images/other/loading.gif'><br> <br></center>");

        $.ajax({
            type: "POST",
            url: url,
            data: {
                Content: Content,
                Title: Title
            },

            cache: false,

            success: function(msg) {
                if (msg != "done") {
                    ShowColorBox(msg)
                    $("#" + loadhere).html("");
                    OpenNewNewsForm()
                }
                else {

                    $("#New_NewsTitle").attr("value", "");
                    $("#New_NewsContent").html("");

                    $("#NewNewsForm").hide();
                    $("#" + loadhere).html("");
                }
            }

        });

    }


    function GetNews(url, loadhere) {

        $("#" + loadhere).html("<div style='height:340px;'><center><br><br><img src='/images/other/loading.gif'><br> <br></center></div>");

        $.ajax({
            type: "POST",
            url: url,
            data: {
        },

        cache: false,

        success: function(msg) {

            $("#" + loadhere).html(msg)
            jQuery().ready(function() {
                jQuery('#news').accordion({
                    autoheight: false
                });
            });
        }

    });

}


/***** Documents ******/
function ShowNewDocumentFrom(GroupID) {
    $("#DocForm_" + GroupID + "").slideDown();

}

function AjaxDeleteGroup(GroupID, deleteurl) {

    if (confirm("Are you sure you want to delete this group ?")) {

        $.ajax({
            type: "POST",
            url: deleteurl,
            data: {

                GroupID: GroupID
            },

            cache: false,

            success: function(msg) {

                if (msg != "done") {
                    ShowColorBox(msg)
                }
                else {
                    //  location.reload(true);
                    $("#GroupHolder_" + GroupID).slideUp()

                }

            }

        });
    }
}

function AjaxAddGroup(GroupName, addurl) {

    $.ajax({
        type: "POST",
        url: addurl,
        data: {

            GroupName: GroupName
        },
        cache: false,

        success: function(msg) {

            if (msg != "done") {
                ShowColorBox(msg)
            }
            else {
                location.reload(true);


            }

        }

    });
}


function AjaxDeleteDocument(DocumentID, GroupID, deleteurl, reloadurl) {

    if (confirm("Are you sure you want to delete this document")) {

        $.ajax({
            type: "POST",
            url: deleteurl,
            data: {

        },
        cache: false,

        success: function(msg) {

            if (msg != "done") {
                ShowColorBox(msg)
            }
            else {

                // AjaxGetDocumentsofGroup(GroupID, reloadurl)
                $("#DocumentHolder_" + DocumentID).slideUp()

            }

        }

    });
}


}

function AjaxAddDocument(DocumentName, GroupID, addurl, reloadurl) {

    $.ajax({
        type: "POST",
        url: addurl,
        data: {
            GroupID: GroupID,
            DocumentName: DocumentName
        },
        cache: false,

        success: function(msg) {

            if (msg != "done") {
                ShowColorBox(msg)
            }
            else {
                $('#DocName_' + GroupID + '').attr('value', '')
                $("#DocForm_" + GroupID + "").hide();

                AjaxGetDocumentsofGroup(GroupID, reloadurl)
            }

        }

    });
}

function AjaxGetDocumentsofGroup(GroupID, url) {

    $("#AllDocumentsHolder_" + GroupID).html("<center><br><br><img src='/images/other/loading.gif'><br> <br></center>");

    $.ajax({
        type: "POST",
        url: url,
        data: {

    },
    cache: false,

    success: function(msg) {

        $("#AllDocumentsHolder_" + GroupID).html(msg);


        /***Enabling upload ***/
        function registerIC(catid, id) {
            DocumentUploadEnable(catid, id, '<%= Url.RouteUrl("ChangeDocumentFile", new {DocumentID="' + catid + '"})%>');
        }
        var delay = 1;
        $('.imageedit').each(function() {
            window.setTimeout("registerIC('" + $(this).attr('id').substring(4) + "', '" + $(this).attr('id') + "')", delay);
            delay += 1;
        });
        /***Enabling upload ***/

    }

});

}



/****** End of documents ********/


function ClearText(id) {
    $(id).attr("value", "");
}



function UserLogin(url, Email, Password, redirectUrlSpares, redirectUrlAdmin) {

    $.ajax({
        type: "POST",
        url: url,
        data: {
            Email: Email,
            Password: Password

        },
        cache: false,
        success: function(msg) {
            var sts = eval('(' + msg + ')');
            status = sts["sts"];
            message = sts["msg"];
            role = sts["role"];
            if (status != "1") {
                //  $("#signupLoading").html("");
                ShowColorBox(message)
                //  alert(message);
            }
            else {
                //  $("#signupLoading").html("");
                if (role == "SparesUser") {
                    location.href = redirectUrlSpares;
                }
                else if (role == "Admin") {
                    location.href = redirectUrlAdmin;
                }
            }
        }

    });

}

function ShowNewUserForm() {
    $("#NewUserForm").slideDown();
}
function HideNewUserForm() {
    $("#NewUserForm").slideUp();
}

function user_add2(url, fullname, email, postcode, company, telephone, role) {

    function Reset() {
        $("#u_fullname").attr("value", "Full Name")
        $("#u_company").attr("value", "Company Name")
        $("#u_postcode").attr("value", "Postcode")
        $("#u_telephone").attr("value", "Telephone number")
        $("#u_email").attr("value", "Email")
    }

    $("#signupLoading").html("Please wait ...");


    $.ajax({
        type: "POST",
        url: url,
        data: {
            UserFullname: fullname,
            UserEmail: email,
            UserCompany: company,
            UserTel: telephone,
            UserPostCode: postcode,
            Role: role

        },
        cache: false,

        success: function(msg) {


            if (msg != "done") {

                $("#signupLoading").html("");
                ShowColorBox(msg)


            }
            else {
                $("#signupLoading").html("");
                ShowColorBox("User added sucessfully");
                location.reload(true);

            }
        }

    });



}


function user_add(url, fullname, email, postcode, company, telephone, role) {

    function Reset() {
        $("#u_fullname").attr("value", "Full Name")
        $("#u_company").attr("value", "Company Name")
        $("#u_postcode").attr("value", "Postcode")
        $("#u_telephone").attr("value", "Telephone number")
        $("#u_email").attr("value", "Email")
    }

    $("#signupLoading").html("Please wait ...");


    $.ajax({
        type: "POST",
        url: url,
        data: {
            UserFullname: fullname,
            UserEmail: email,
            UserCompany: company,
            UserTel: telephone,
            UserPostCode: postcode,
            Role: role

        },
        cache: false,

        success: function(msg) {


            if (msg != "done") {

                $("#signupLoading").html("");
                ShowColorBox(msg)


            }
            else {
                $("#signupLoading").html("");
                ShowColorBox("Thank you for registering.<br><br>Your request has been sent to Marren for approval.<br>You will be sent a password when you have been approved. ");

                Reset();

            }
        }

    });



}


function ShowBrandFrom() {
    $("#NewBrandForm").show();

}

function AddBrand(BrandName, url, redirectUrl) {

    $("#BrandLoading").html("please wait...")
    $.ajax({
        type: "POST",
        url: url,
        data: {
            BrandName: BrandName

        },
        cache: false,

        success: function(msg) {



            var sts = eval('(' + msg + ')');

            RES = sts["status"];
            BID = sts["bid"];

            if (RES != "done") {
                $("#BrandLoading").html("")
                ShowColorBox(RES)
            }
            else {
                location.href = redirectUrl + "/" + BID

            }


        }

    });
}


/*************** Spares ***************/

function ChooseBrand(BrandID, BrandName, url) {

    $("#TextSelectedBrand").attr("value", BrandName);
    $('.sparesmenu').hide()


    $("#ModelList").html("<center>Loading...</center>");

    $.ajax({
        type: "POST",
        url: url + "/" + BrandID,
        data: {

    },
    cache: false,

    success: function(msg) {

        $("#ModelList").html(msg);

    }

});
}

function ChooseModel(ModelID, ModelName, url) {

    $("#TextSelectedModel").attr("value", ModelName);



    $("#res").html("<center><br><br><img src='/images/other/loading.gif'><br> <br></center>");

    $.ajax({
        type: "POST",
        url: url + "/" + ModelID,
        data: {

    },
    cache: false,

    success: function(msg) {

        $("#res").html(msg);
        $('.sparesmenu').hide()


    }

});





}

function BrandsAutoComplete(srearchtext, url, loadhere) {
    // $("#" + loadhere).html("<center><br><br><img src='/images/other/loading.gif'><br> <br></center>");
    // EnableDropDownProducts()
    $.ajax({
        type: "POST",
        url: url + "/" + srearchtext,
        data: {

    },
    cache: false,

    success: function(msg) {

        $("#" + loadhere).html(msg);
    }

});
}


function GetSpareByID(SpareID, loadhere, url) {

    $("#" + loadhere).html("<center><br><br><img src='/images/other/loading.gif'><br> <br></center>");

    $.ajax({
        type: "POST",
        url: url + "/",
        data: {
            PartID: SpareID
        },
        cache: false,

        success: function(msg) {

            $("#" + loadhere).html(msg);
        }

    });

}

/*************** Spares ***************/

function ChangeClass(obj, classname) {

    document.getElementById(obj).className = classname

}

/**************** Inplace editor **************/

function setClickableTextArea(area, style, url) {

    $('#' + area).qtip(
   {
       content: '<span style="font-size:11px;">Click to edit</span>',
       style: {
           padding: 3,
           background: '#EB2526',
           color: 'white',
           textAlign: 'center',
           border: {
               width: 1,
               radius: 3,
               color: '#000000'
           },
           tip: 'topLeft'
       },
       show: { delay: 0, effect: { length: 0} }
   });


    $('#' + area).click(function() {
        var textarea = "<span class='" + style + "'><textarea style='width:250px;'>" + $(this).html() + "</textarea><br>";
        var button = '<span>&nbsp;<input  type="button" value="Save" class="saveButton" />&nbsp;<input type="button"   value="Cancel" class="cancelButton" /></span></span>';
        var revert = $(this).html();
        $(this).after(textarea + button).remove();
        $('.saveButton').click(function() { saveChanges(this, false, style, area, url); $(".qtip").hide(); });
        $('.cancelButton').click(function() { saveChanges(this, revert, style, area, url); $(".qtip").hide(); });
        $(".qtip").hide();
    })
.mouseover(function() {
    $(this).addClass("editable");

})
.mouseout(function() {
    $(this).removeClass("editable");
    //$(".qtip").hide();
});
};

function setClickable(area, style, url) {
    // $(".qtip").hide();

    $('#' + area).qtip(
   {
       content: '<span style="font-size:11px;">Click to edit</span>',
       style: {
           padding: 3,
           background: '#EB2526',
           color: 'white',
           textAlign: 'center',
           border: {
               width: 1,
               radius: 3,
               color: '#000000'
           },
           tip: 'topLeft'
       },
       show: { delay: 0, effect: { length: 0} }
   });


    $('#' + area).click(function() {
        var textarea = "<span class='" + style + "'><input  type='text' value='" + $(this).html() + "' >";
        var button = '<span>&nbsp;<input  type="button" value="Save" class="saveButton" />&nbsp;<input type="button"   value="Cancel" class="cancelButton" /></span></span>';
        var revert = $(this).html();
        $(this).after(textarea + button).remove();
        $('.saveButton').click(function() { saveChanges(this, false, style, area, url); $(".qtip").hide(); });
        $('.cancelButton').click(function() { saveChanges(this, revert, style, area, url); $(".qtip").hide(); });
        $(".qtip").hide();
    })
.mouseover(function() {
    $(this).addClass("editable");


})
.mouseout(function() {
    $(this).removeClass("editable");
});
};

function saveChanges(obj, cancel, style, inplacearea, url) {



    if (!cancel) {
        var t = $(obj).parent().siblings(0).val();



        if (t == '') t = '(click to add text)';
        $(obj).parent().parent().after("<span  id='" + inplacearea + "' class='" + style + "'>" + t + "</span>").remove();

        $("#" + inplacearea).text("Saving ...");

        $.ajax({
            type: "POST",
            url: url,
            data: {
                newcontent: t
            },
            cache: false,
            success: function(msg) {
                $("#" + inplacearea).text(msg);

            }

        });


    }
    else {
        var t = cancel;

        if (t == '') t = '(click to add text)';
        $(obj).parent().parent().after("<span  id='" + inplacearea + "' class='" + style + "'>" + t + "</span>").remove();
    }
    //    if (t == '') t = '(click to add text)';
    //    $(obj).parent().parent().after("<span  id='" + inplacearea + "' class='" + style + "'>" + t + "</span>").remove();


    setClickable(inplacearea, style, url);
}

/*************** End of inplace editor *********************/

function ShowNewProductForm() {
    $("#NewProductForm").show();
}

function Product_addNew(ajaxfile, CategoryID, BrabdID, ProductName, loadhere) {

    $("#" + loadhere).html("Please wait...");

    $("#b_newproduct").attr("disabled", true);

    $.ajax({
        type: "POST",
        url: ajaxfile,
        data: {

            Category_id: CategoryID,
            Brand_id: BrabdID,
            Product_Name: ProductName

        },
        cache: false,

        success: function(msg) {

            if (msg != "done") {
                $("#" + loadhere).html("");
                $("#b_newproduct").attr("disabled", false);
                ShowColorBox(msg)
            }
            else {

                location.reload(true);
            }

        }

    });

}





function Product_add(ajaxfile, CategoryID, BrabdID, ProductName, loadhere) {

    $("#" + loadhere).html("Please wait...");
    $.ajax({
        type: "POST",
        url: ajaxfile,
        data: {

            Category_id: CategoryID,
            Brand_id: BrabdID,
            Product_Name: ProductName

        },
        cache: false,

        success: function(msg) {

            if (msg != "done") {
                $("#" + loadhere).html("");
                ShowColorBox(msg)
            }
            else {
                $("#" + loadhere).html("");
                $("#pro_name_in").attr("value", "");
                // alert("New product added to this category");
                location.reload(true);
            }

        }

    });

}




function Category_Delete(CategoryID) {

    url = "/category.aspx/Delete/" + CategoryID;


    if (confirm("Are you sure you want to delete this category")) {
        $.ajax({
            type: "POST",
            url: url,
            data: {


        },
        cache: false,

        success: function(msg) {

            if (msg != "done") {
                // $("#" + loadhere).html("");
                ShowColorBox(msg)
            }
            else {
                //  $("#" + loadhere).html("");

                $("#BLOCK_" + CategoryID).slideUp();

            }

        }

    });
}

}

function ShowNewcategoryForm() {
    $("#NewCategoryForm").show();
}

function Category_addNew(ajaxfile, BrandID, CategoryName, loadhere) {

    $("#b_newcategory").attr("disabled", true);


    $("#" + loadhere).html("Saving...");
    $.ajax({
        type: "POST",
        url: ajaxfile,
        data: {
            Brand_id: BrandID,
            Category_name: CategoryName

        },
        cache: false,

        success: function(msg) {

            if (msg != "done") {
                $("#" + loadhere).html("");
                $("#b_newcategory").attr("disabled", false);
                ShowColorBox(msg)
            }
            else {

                location.reload(true);

            }

        }

    });




}





function Category_add(ajaxfile, BrandID, CategoryName, loadhere) {

    $("#" + loadhere).html("Please wait...");
    $.ajax({
        type: "POST",
        url: ajaxfile,
        data: {
            Brand_id: BrandID,
            Category_name: CategoryName

        },
        cache: false,

        success: function(msg) {

            if (msg != "done") {
                $("#" + loadhere).html("");
                ShowColorBox(msg)
            }
            else {
                $("#" + loadhere).html("");
                $("#cat_name_in").attr("value", "");
                //   alert("New category added to this brand");
                location.reload(true);

            }

        }

    });




}

function ChangeCategoryImage(CategoryID, ButtonID) {


    url = "/images.aspx/category/" + CategoryID;

    //   alert(ButtonID)






    $(document).ready(function() {
        new AjaxUpload('#' + ButtonID + '', {

            action: url,
            data: {

                'key2': "be send because",
                'key3': "we will overwrite it"
            },
            onSubmit: function(file, ext) {

                if (ext && /^(jpg|png|jpeg|gif)$/.test(ext)) {

                    this.setData({
                        'key': 'This string will be send with the file'
                    });

                    $('#__EI' + CategoryID).attr("src", "/images/other/loading.gif")
                } else {

                    // extension is not allowed
                    ShowColorBox('Error: only images are allowed');
                    // cancel upload
                    return false;
                }

            },
            onComplete: function(file, ext) {
                $('#loading_' + CategoryID).text("");
                //  alert(ext);
                $("#__EI" + CategoryID).attr("src", "/images/category/" + ext);
                // alert(file);

            }
        });
    });



}

function CategoryImageChangeEnable(CategoryID, ButtonID, ajaxfile) {

    $(document).ready(function() {
        new AjaxUpload('#' + ButtonID + '', {
            //action: 'upload.php',
            action: ajaxfile, // I disabled uploads in this example for security reaaons
            data: {

                'key2': "be send because",
                'key3': "we will overwrite it"
            },
            onSubmit: function(file, ext) {

                //if (ext && new RegExp('^(' + allowed.join('|') + ')$').test(ext)){
                if (ext && /^(jpg|png|jpeg|gif)$/.test(ext)) {
                    /* Setting data */
                    this.setData({
                        'key': 'This string will be send with the file'
                    });

                    $('#__EI' + CategoryID).attr("src", "/images/other/loading.gif")
                } else {

                    // extension is not allowed
                    ShowColorBox('Error: only images are allowed');
                    // cancel upload
                    return false;
                }

            },
            onComplete: function(file, ext) {
                $('#loading_' + CategoryID).text("");
                //  alert(ext);
                $("#__EI" + CategoryID).attr("src", "/images/category/" + ext);
                // alert(file);

            }
        });
    });

}


function ProductImageChangeEnable(ProductID, ButtonID, ajaxfile) {
    $(document).ready(function() {
        new AjaxUpload('#' + ButtonID + '', {
            //action: 'upload.php',
            action: ajaxfile, // I disabled uploads in this example for security reaaons
            data: {

                'key2': "be send because",
                'key3': "we will overwrite it"
            },
            onSubmit: function(file, ext) {
                //if (ext && new RegExp('^(' + allowed.join('|') + ')$').test(ext)){
                if (ext && /^(jpg|png|jpeg|gif)$/.test(ext)) {
                    /* Setting data */
                    this.setData({
                        'key': 'This string will be send with the file'
                    });

                    $('#__EI' + ProductID).attr("src", "/images/other/loading.gif")
                } else {

                    // extension is not allowed
                    ShowColorBox('Error: only images are allowed');
                    // cancel upload
                    return false;
                }

            },
            onComplete: function(file, ext) {
                $('#loading_' + ProductID).text("");
                //  alert(ext);
                $("#__EI" + ProductID).attr("src", "/images/products/big_" + ext);
                // alert(file);


            }
        });
    });

}

function ManualChangeEnable(ProductID, ButtonID, ajaxfile) {
    $(document).ready(function() {
        new AjaxUpload('#' + ButtonID + '', {
            //action: 'upload.php',
            action: ajaxfile, // I disabled uploads in this example for security reaaons
            data: {

                'key2': "be send because",
                'key3': "we will overwrite it"
            },
            onSubmit: function(file, ext) {
                //if (ext && new RegExp('^(' + allowed.join('|') + ')$').test(ext)){
                if (ext && /^(pdf|)$/.test(ext)) {
                    /* Setting data */
                    this.setData({
                        'key': 'This string will be send with the file'
                    });

                    //   $('#__EM' + ProductID).attr("src", "/images/other/loading.gif")
                } else {

                    // extension is not allowed
                    ShowColorBox('Error: only PDF is allowed');
                    // cancel upload
                    return false;
                }

            },
            onComplete: function(file, ext) {
                //  $('#loading_' + ProductID).text("");
                //  alert(ext);
                //  $("#__EM" + ProductID).attr("src", "/images/products/big_" + ext);
                //   ShowColorBox("Manual file is uploaded");
                alert("Manual file is uploaded");
                 location.reload(true);

            }
        });
    });

}

function PartdocChangeEnable(ProductID, ButtonID, ajaxfile) {
    $(document).ready(function() {
        new AjaxUpload('#' + ButtonID + '', {
            //action: 'upload.php',
            action: ajaxfile, // I disabled uploads in this example for security reaaons
            data: {

                'key2': "be send because",
                'key3': "we will overwrite it"
            },
            onSubmit: function(file, ext) {
                //if (ext && new RegExp('^(' + allowed.join('|') + ')$').test(ext)){
                if (ext && /^(pdf|)$/.test(ext)) {
                    /* Setting data */
                    this.setData({
                        'key': 'This string will be send with the file'
                    });

                    //   $('#__EM' + ProductID).attr("src", "/images/other/loading.gif")
                } else {

                    // extension is not allowed
                    ShowColorBox('Error: only PDF is allowed');
                    // cancel upload
                    return false;
                }

            },
            onComplete: function(file, ext) {
                //  $('#loading_' + ProductID).text("");
                //  alert(ext);
                //  $("#__EM" + ProductID).attr("src", "/images/products/big_" + ext);
            alert("Parts document file is uploaded");
              //  ShowColorBox("Parts document file is uploaded");
                location.reload(true);

            }
        });
    });

}


function BrandImageChangeEnable(BrandID, ButtonID, ajaxfile) {
    $(document).ready(function() {

        new AjaxUpload('#' + ButtonID + '', {
            //action: 'upload.php',
            action: ajaxfile, // I disabled uploads in this example for security reaaons
            data: {

                'key2': "be send because",
                'key3': "we will overwrite it"
            },
            onSubmit: function(file, ext) {
                //if (ext && new RegExp('^(' + allowed.join('|') + ')$').test(ext)){
                if (ext && /^(jpg|png|jpeg|gif)$/.test(ext)) {
                    /* Setting data */
                    this.setData({
                        'key': 'This string will be send with the file'
                    });

                    $('#__EIB' + BrandID).attr("src", "/images/other/loading.gif")
                } else {

                    // extension is not allowed
                    ShowColorBox('Error: only images are allowed');
                    // cancel upload
                    return false;
                }

            },
            onComplete: function(file, ext) {
                //  $('#loading_' + BrandID).text("");
                //  alert(ext);
                $("#__EIB" + BrandID).attr("src", "/images/brands/logosmall_" + ext);
                // alert(file);


            }
        });
    });

}

function DocumentUploadEnable(ProductID, ButtonID, ajaxfile) {
    $(document).ready(function() {
        new AjaxUpload('#' + ButtonID + '', {
            //action: 'upload.php',
            action: ajaxfile, // I disabled uploads in this example for security reaaons
            data: {

                'key2': "be send because",
                'key3': "we will overwrite it"
            },
            onSubmit: function(file, ext) {
                //if (ext && new RegExp('^(' + allowed.join('|') + ')$').test(ext)){
                if (ext && /^(pdf|)$/.test(ext)) {
                    /* Setting data */
                    this.setData({
                        'key': 'This string will be send with the file'
                    });

                    $('#__EI' + ProductID).html("&nbsp;&nbsp; <b>Uploading...</b>")
                } else {

                    // extension is not allowed
                    ShowColorBox('Error: only PDF is allowed');
                    // cancel upload
                    return false;
                }

            },
            onComplete: function(file, ext) {
                //  $('#loading_' + ProductID).text("");
                //  alert(ext);
                //  $("#__EM" + ProductID).attr("src", "/images/products/big_" + ext);
                ShowColorBox("Document file is uploaded");
                $('#__EI' + ProductID).html("&nbsp;&nbsp; Upload PDF")

                $("#ViewHolder_" + ProductID).html("<a class='main_content' target='_blank' href=/Asset.aspx/GetPDF/Documents/" + ext + ">View</a>");
                //  $("#DocumentView_" + ProductID).attr("href", "/Asset.aspx/GetPDF/Documents/" + ext + "");
                //   $("#DocumentView_" + ProductID).attr("text", "View");
                // location.reload(true);

            }
        });
    });

}


/***************** Text area blank **************************/
function saveHTMLBlank(pageid, area) {

    var newcontent = $("#t_" + area).val()


    $('#b_' + area).remove();

    $("#" + area).html("<center><img src='/images/other/loading.gif'><br> Saving ... </center>");
    $.ajax({
        type: "POST",
        url: "/Ajax.aspx/UpdateBlockContent/",
        data: {

            PageID: pageid,
            BlockID: area,
            NewContent: newcontent

        },
        cache: false,

        success: function(msg) {

            $("#" + area).html(msg);


        }

    });

}

function cancelHTMLBlank(area, currentcontent) {
    //  alert(tinyMCE.get(area).getContent())
    // tinyMCE.execCommand('mceRemoveControl', false, area);



    $("#" + area).text(currentcontent)

    $('#b_' + area).remove();


}



function ActivateTinyMCEBlank(PageID, area, width, height) {

    currentContent = $("#" + area).html();
    $("#" + area).html("");
    var button = '<span id="b_' + area + '"><input  type="button" value="Save" class="saveButton" onclick="saveHTMLBlank(\'' + PageID + '\',\'' + area + '\')" />&nbsp;<input type="button"  onclick="cancelHTMLBlank(\'' + area + '\',\'' + currentContent + '\')"  value="Cancel" class="cancelButton" /><br><textarea style="width:' + width + '; height:' + height + ';" id="t_' + area + '">' + currentContent + '</textarea></span>';
    $('#' + area).before(button);

}


/************************************************/




function saveHTML(pageid, area) {


    var newcontent = tinyMCE.get(area).getContent()

    tinyMCE.execCommand('mceRemoveControl', false, area);
    $('#b_' + area).remove();

    $("#" + area).html("<center><img src='/images/other/loading.gif'><br> Saving ... </center>");
    $.ajax({
        type: "POST",
        url: "/Ajax.aspx/UpdateBlockContent/",
        data: {

            PageID: pageid,
            BlockID: area,
            NewContent: newcontent

        },
        cache: false,

        success: function(msg) {

            $("#" + area).html(msg);


        }

    });



}

function cancelHTML(area) {
    //  alert(tinyMCE.get(area).getContent())
    tinyMCE.execCommand('mceRemoveControl', false, area);
    $('#b_' + area).remove();

}

function ActivateTinyMCE(PageID, area, width, height) {



    var button = '<span id="b_' + area + '"><input  type="button" value="Save" class="saveButton" onclick="saveHTML(\'' + PageID + '\',\'' + area + '\')" />&nbsp;<input type="button"  onclick="cancelHTML(\'' + area + '\')"  value="Cancel" class="cancelButton" /></span>';
    $('#' + area).before(button);


    var configArray = [{
        theme: "advanced",
        mode: "none",
        language: "en",
        width: width,
        height: height,
        theme_advanced_layout_manager: "SimpleLayout",
        theme_advanced_toolbar_location: "top",
        theme_advanced_toolbar_align: "left",
        theme_advanced_buttons1: "save|,bold,italic,underline|,justifyleft,justifycenter,justifyright,justifyfull",
        theme_advanced_buttons2: "cut,copy,paste,pastetext,pasteword,|,bullist,numlist,|,outdent,indent",
        theme_advanced_buttons3: "link,unlink,anchor,image,code,||,forecolor,backcolor",
        theme_advanced_buttons4: "fontsizeselect"


    }, {
        theme: "advanced",
        mode: "none",
        language: "en",
        width: width,
        height: height,
        theme_advanced_layout_manager: "SimpleLayout",
        theme_advanced_toolbar_location: "top",
        theme_advanced_toolbar_align: "left"
}]

        tinyMCE.settings = configArray[0];

        tinyMCE.execCommand('mceAddControl', false, area);


    }





    function SaveData(ajaxfile, content, table, field, idfield, id, loadhere) {


        $.ajax({
            type: "POST",
            url: ajaxfile,
            data: {

                table: table,
                field: field,
                idfield: idfield,
                id: id,
                newcontent: content

            },
            cache: false,

            success: function(msg) {

                $("#" + loadhere).html(msg);
            }

        });


    }

    /***************** Richtext*******************/
    function ActivateRichText(area, width, height, ajaxfile) {

        //   alert(ajaxfile);

        var button = '<span id="b_' + area + '"><input  type="button" value="Save" class="saveButton" onclick="saveHTMLRichText(\'' + area + '\',\'' + ajaxfile + '\')" />&nbsp;<input type="button"  onclick="cancelHTMLRichText(\'' + area + '\')"  value="Cancel" class="cancelButton" /></span>';
        $('#' + area).before(button);


        var configArray = [{
            theme: "advanced",
            mode: "none",
            language: "en",
            width: width,
            height: height,
            theme_advanced_layout_manager: "SimpleLayout",
            theme_advanced_toolbar_location: "top",
            theme_advanced_toolbar_align: "left",
            theme_advanced_buttons1: "save|,bold,italic,underline|,justifyleft,justifycenter,justifyright,justifyfull",
            theme_advanced_buttons2: "cut,copy,paste,pastetext,pasteword,|,bullist,numlist,|,outdent,indent",
            theme_advanced_buttons3: "link,unlink,anchor,image,code,||,forecolor,backcolor",
            theme_advanced_buttons4: "fontsizeselect"
        }, {
            theme: "advanced",
            mode: "none",
            language: "en",
            width: width,
            height: height,
            theme_advanced_layout_manager: "SimpleLayout",
            theme_advanced_toolbar_location: "top",
            theme_advanced_toolbar_align: "left"
}]

            tinyMCE.settings = configArray[0];

            tinyMCE.execCommand('mceAddControl', false, area);


        }

        function saveHTMLRichText(area, ajaxfile) {


            var newcontent = tinyMCE.get(area).getContent()

            tinyMCE.execCommand('mceRemoveControl', false, area);
            $('#b_' + area).remove();

            $("#" + area).html("<center><img src='/images/other/loading.gif'><br> Saving ... </center>");
            $.ajax({
                type: "POST",
                url: ajaxfile,
                data: {

                    NewContent: newcontent

                },
                cache: false,

                success: function(msg) {

                    $("#" + area).html(msg);



                }

            });



        }

        function cancelHTMLRichText(area) {
            //  alert(tinyMCE.get(area).getContent())
            tinyMCE.execCommand('mceRemoveControl', false, area);
            $('#b_' + area).remove();

        }
$(document).ready(function() {
    $('.dropdownmenu').each(function() {
        $(this).attr('hhh', $(this).height());
    });
    $('.dropdownmenu').hide().height(0);
    $('.dropdown-menu').hover(
      function() {
          $('.top_links', this).addClass('active_tab');
          $('.dropdownmenu', this).stop().show().animate({ height: $('.dropdownmenu', this).attr('hhh') }, 200);
      },
      function() {
          obj = this;
          $('.top_links', obj).removeClass('active_tab');
          $('.dropdownmenu', this).stop().animate({ height: 0 }, 200, function() { $('.dropdownmenu').hide(); });
      }
    );

      //    EnableDropDownProducts();

      ///////////////////////////////////////
      $('.sparesmenu').each(function() {
          $(this).attr('hhh', $(this).height());
      });
      $('.sparesmenu').hide().height(0);
      $('.spares_menu').hover(
      function() {
          $('.drop_but', this).addClass('active_tab');
          $('.sparesmenu', this).stop().show().animate({ height: $('.sparesmenu', this).attr('hhh') }, 200);
      },
      function() {
          obj = this;
          $('.drop_but', obj).removeClass('active_tab');
          $('.sparesmenu', this).stop().animate({ height: 0 }, 200, function() { $('.sparesmenu').hide(); });
      }
    );

});

function EnableDropDownProducts() {
   
        $('.sparesmenu').each(function() {
            $(this).attr('hhh', $(this).height());
        });
        $('.sparesmenu').hide().height(0);
        $('.spares_menu').hover(
      function() {
          $('.drop_but', this).addClass('active_tab');
          $('.sparesmenu', this).stop().show().animate({ height: $('.sparesmenu', this).attr('hhh') }, 200);
      },
      function() {
          obj = this;
          $('.drop_but', obj).removeClass('active_tab');
          $('.sparesmenu', this).stop().animate({ height: 0 }, 200, function() { $('.sparesmenu').hide(); });
      }
    );
  

}
var slideMenu=function(){
	var sp,st,t,m,sa,l,w,sw,ot;
	return{
		build:function(sm,sw,mt,s,sl,h){
			sp=s; st=sw; t=mt;
			m=document.getElementById(sm);
			sa=m.getElementsByTagName('li');
			l=sa.length; w=m.offsetWidth; sw=w/l;
			ot=Math.floor((w-st)/(l-1)); var i=0;
			for(i;i<l;i++){s=sa[i]; s.style.width=sw+'px'; this.timer(s)}
			if(sl!=null){m.timer=setInterval(function(){slideMenu.slide(sa[sl-1])},t)}
		},
		timer:function(s){s.onmouseover=function(){clearInterval(m.timer);m.timer=setInterval(function(){slideMenu.slide(s)},t)}},
		slide:function(s){
			var cw=parseInt(s.style.width,'10');
			if(cw<st){
				var owt=0; var i=0;
				for(i;i<l;i++){
					if(sa[i]!=s){
						var o,ow; var oi=0; o=sa[i]; ow=parseInt(o.style.width,'10');
						if(ow>ot){oi=Math.floor((ow-ot)/sp); oi=(oi>0)?oi:1; o.style.width=(ow-oi)+'px'}
						owt=owt+(ow-oi)}}
				s.style.width=(w-owt)+'px';
			}else{clearInterval(m.timer)}
		}
	};
}();
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('8={3b:"1.6",2o:"1B.1Y,1B.23,1B.2e",2i:"",2H:1a,12:"",2C:1a,Z:"",2a:\'<H V="$0">$$</H>\',R:"&#F;",1j:"&#F;&#F;&#F;&#F;",1f:"&#F;<1W/>",3c:5(){9 $(y).39("1k")[0]},I:{},N:{}};(5($){$(5(){5 1J(l,a){5 2I(A,h){4 3=(1v h.3=="1h")?h.3:h.3.1w;k.1m({A:A,3:"("+3+")",u:1+(3.c(/\\\\./g,"%").c(/\\[.*?\\]/g,"%").3a(/\\((?!\\?)/g)||[]).u,z:(h.z)?h.z:8.2a})}5 2z(){4 1E=0;4 1x=x 2A;Q(4 i=0;i<k.u;i++){4 3=k[i].3;3=3.c(/\\\\\\\\|\\\\(\\d+)/g,5(m,1F){9!1F?m:"\\\\"+(1E+1+1t(1F))});1x.1m(3);1E+=k[i].u}4 1w=1x.3d("|");9 x 1u(1w,(a.3g)?"2j":"g")}5 1S(o){9 o.c(/&/g,"&3h;").c(/</g,"&3e;")}5 1R(o){9 o.c(/ +/g,5(1X){9 1X.c(/ /g,R)})}5 G(o){o=1S(o);7(R){o=1R(o)}9 o}5 2m(2E){4 i=0;4 j=1;4 h;19(h=k[i++]){4 1b=D;7(1b[j]){4 1U=/(\\\\\\$)|(?:\\$\\$)|(?:\\$(\\d+))/g;4 z=h.z.c(1U,5(m,1V,K){4 3f=\'\';7(1V){9"$"}v 7(!K){9 G(1b[j])}v 7(K=="0"){9 h.A}v{9 G(1b[j+1t(K,10)])}});4 1A=D[D.u-2];4 2h=D[D.u-1];4 2G=2h.2v(11,1A);11=1A+2E.u;14+=G(2G)+z;9 z}v{j+=h.u}}}4 R=8.R;4 k=x 2A;Q(4 A 2r a.k){2I(A,a.k[A])}4 14="";4 11=0;l.c(2z(),2m);4 2y=l.2v(11,l.u);14+=G(2y);9 14}5 2B(X){7(!8.N[X]){4 Y=\'<Y 32="1p" 33="p/2u"\'+\' 30="\'+X+\'">\';8.N[X]=1H;7($.31.34){4 W=J.1L(Y);4 $W=$(W);$("2d").1O($W)}v{$("2d").1O(Y)}}}5 1q(e,a){4 l=e&&e.1g&&e.1g[0]&&e.1g[0].37;7(!l)l="";l=l.c(/\\r\\n?/g,"\\n");4 C=1J(l,a);7(8.1j){C=C.c(/\\t/g,8.1j)}7(8.1f){C=C.c(/\\n/g,8.1f)}$(e).38(C)}5 1o(q,13){4 1l={12:8.12,2x:q+".1d",Z:8.Z,2w:q+".2u"};4 B;7(13&&1v 13=="2l")B=$.35(1l,13);v B=1l;9{a:B.12+B.2x,1p:B.Z+B.2w}}7($.2q)$.2q({36:"2l.15"});4 2n=x 1u("\\\\b"+8.2i+"\\\\b","2j");4 1e=[];$(8.2o).2D(5(){4 e=y;4 1n=$(e).3i("V");7(!1n){9}4 q=$.3u(1n.c(2n,""));7(\'\'!=q){1e.1m(e);4 f=1o(q,e.15);7(8.2H||e.15){7(!8.N[f.a]){1D{8.N[f.a]=1H;$.3v(f.a,5(M){M.f=f.a;8.I[f.a]=M;7(8.2C){2B(f.1p)}$("."+q).2D(5(){4 f=1o(q,y.15);7(M.f==f.a){1q(y,M)}})})}1I(3s){3t("a 3w Q: "+q+\'@\'+3z)}}}v{4 a=8.I[f.a];7(a){1q(e,a)}}}});7(J.1i&&J.1i.29){5 22(p){7(\'\'==p){9""}1z{4 16=(x 3A()).2k()}19(p.3x(16)>-1);p=p.c(/\\<1W[^>]*?\\>/3y,16);4 e=J.1L(\'<1k>\');e.3l=p;p=e.3m.c(x 1u(16,"g"),\'\\r\\n\');9 p}4 T="";4 18=1G;$(1e).3j().G("1k").U("2c",5(){18=y}).U("1M",5(){7(18==y)T=J.1i.29().3k});$("3n").U("3q",5(){7(\'\'!=T){2p.3r.3o(\'3p\',22(T));2V.2R=1a}}).U("2c",5(){T=""}).U("1M",5(){18=1G})}})})(1Z);8.I["1Y.1d"]={k:{2M:{3:/\\/\\*[^*]*\\*+(?:[^\\/][^*]*\\*+)*\\//},25:{3:/\\<!--(?:.|\\n)*?--\\>/},2f:{3:/\\/\\/.*/},2P:{3:/2L|2T|2J|2O|2N|2X|2K|2Z|2U|2S|2W|2Y|2Q|51|c-50/},53:{3:/\\/[^\\/\\\\\\n]*(?:\\\\.[^\\/\\\\\\n]*)*\\/[52]*/},1h:{3:/(?:\\\'[^\\\'\\\\\\n]*(?:\\\\.[^\\\'\\\\\\n]*)*\\\')|(?:\\"[^\\"\\\\\\n]*(?:\\\\.[^\\"\\\\\\n]*)*\\")/},27:{3:/\\b[+-]?(?:\\d*\\.?\\d+|\\d+\\.?\\d*)(?:[1r][+-]?\\d+)?\\b/},4X:{3:/\\b(D|1N|1K|1I|2t|2s|4W|1z|v|1a|Q|5|7|2r|4Z|x|1G|9|1Q|y|1H|1D|1v|4|4Y|19|59)\\b/},1y:{3:/\\b(58|2k|2p|5b|5a|55|J|54|57|1t|56|4L|4K|4N|4M|4H|4G|4J)\\b/},1C:{3:/(?:\\<\\w+)|(?:\\>)|(?:\\<\\/\\w+\\>)|(?:\\/\\>)/},26:{3:/\\s+\\w+(?=\\s*=)/},20:{3:/([\\"\\\'])(?:(?:[^\\1\\\\\\r\\n]*?(?:\\1\\1|\\\\.))*[^\\1\\\\\\r\\n]*?)\\1/},21:{3:/&[\\w#]+?;/},4I:{3:/(\\$|1Z)/}}};8.I["23.1d"]={k:{25:{3:/\\<!--(?:.|\\n)*?--\\>/},1h:{3:/(?:\\\'[^\\\'\\\\\\n]*(?:\\\\.[^\\\'\\\\\\n]*)*\\\')|(?:\\"[^\\"\\\\\\n]*(?:\\\\.[^\\"\\\\\\n]*)*\\")/},27:{3:/\\b[+-]?(?:\\d*\\.?\\d+|\\d+\\.?\\d*)(?:[1r][+-]?\\d+)?\\b/},1C:{3:/(?:\\<\\w+)|(?:\\>)|(?:\\<\\/\\w+\\>)|(?:\\/\\>)/},26:{3:/\\s+\\w+(?=\\s*=)/},20:{3:/([\\"\\\'])(?:(?:[^\\1\\\\\\r\\n]*?(?:\\1\\1|\\\\.))*[^\\1\\\\\\r\\n]*?)\\1/},21:{3:/&[\\w#]+?;/}}};8.I["2e.1d"]={k:{4S:{3:/\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\//},2f:{3:/(?:\\/\\/.*)|(?:[^\\\\]\\#.*)/},4V:{3:/\\\'[^\\\'\\\\]*(?:\\\\.[^\\\'\\\\]*)*\\\'/},4U:{3:/\\"[^\\"\\\\]*(?:\\\\.[^\\"\\\\]*)*\\"/},4P:{3:/\\b(?:[4O][2b][1s][1s]|[4R][4Q][2b][1P]|[5c][5v][1s][5u][1P])\\b/},5x:{3:/\\b[+-]?(\\d*\\.?\\d+|\\d+\\.?\\d*)([1r][+-]?\\d+)?\\b/},5y:{3:/\\b(?:5z|5w(?:5A|5E(?:5F(?:17|1c)|5G(?:17|1c))|17|1T|5B|5C|5D(?:17|1T|1c)|1c)|P(?:5h(?:5k|5j)|5e(?:5d|5g(?:5f|5l)|5r|E(?:5t|5s)|5n(?:5m|5p)|L(?:3X|3W)|O(?:S|3Y(?:3T|3S|3V))|3U|S(?:44|47|46)|41))|40)\\b/},1y:{3:/(?:\\$43|\\$42|\\$3R|\\$3G|\\$3F|\\$3I|\\$3H|\\$3C|\\$3B|\\$3D)\\b/},28:{3:/\\b(?:3O|3N|3P|3K|3J|3M|3L|48|4v|1N|1K|1I|4u|V|4x|4w|2t|4r|2s|4q|1z|4t|v|4s|4D|4C|4F|4E|4z|4y|4B|4A|4p|4d|2F|2F|4g|Q|4f|5|1y|7|4a|4m|4l|4o|4i|4k|x|4j|4h|4n|4b|4c|49|4e|3Q|3E|9|45|1Q|y|3Z|1D|5o|5q|4|19|5i)\\b/},2g:{3:/\\$(\\w+)/,z:\'<H V="28">$</H><H V="2g">$1</H>\'},1C:{3:/(?:\\<\\?[24][4T][24])|(?:\\<\\?)|(?:\\?\\>)/}}}',62,353,'|||exp|var|function||if|ChiliBook|return|recipe||replace||el|path||step|||steps|ingredients|||str|text|recipeName||||length|else||new|this|replacement|stepName|settings|dish|arguments||160|filter|span|recipes|document|||recipeLoaded|required|||for|replaceSpace||insidePRE|bind|class|domLink|stylesheetPath|link|stylesheetFolder||lastIndex|recipeFolder|options|perfect|chili|newline|ERROR|downPRE|while|false|aux|WARNING|js|codes|replaceNewLine|childNodes|string|selection|replaceTab|pre|settingsDef|push|elClass|getPath|stylesheet|makeDish|eE|Ll|parseInt|RegExp|typeof|source|exps|global|do|offset|code|tag|try|prevLength|aNum|null|true|catch|cook|case|createElement|mouseup|break|append|Ee|switch|replaceSpaces|escapeHTML|NOTICE|pattern|escaped|br|spaces|mix|jQuery|avalue|entity|preformatted|xml|Pp|htcom|aname|numbers|keyword|createRange|defaultReplacement|Uu|mousedown|head|php|com|variable|input|elementClass|gi|valueOf|object|chef|selectClass|elementPath|window|metaobjects|in|default|continue|css|substring|stylesheetFile|recipeFile|lastUnmatched|knowHow|Array|checkCSS|stylesheetLoading|each|matched|extends|unmatched|recipeLoading|prepareStep|unblockUI|ajaxSubmit|silverlight|jscom|unblock|block|plugin|clearFields|returnValue|fieldValue|blockUI|formSerialize|event|resetForm|ajaxForm|clearForm|fieldSerialize|href|browser|rel|type|msie|extend|selector|data|html|next|match|version|getPRE|join|lt|bit|ignoreCase|amp|attr|parents|htmlText|innerHTML|innerText|body|setData|Text|copy|clipboardData|recipeNotAvailable|alert|trim|getJSON|unavailable|indexOf|ig|recipePath|Date|_SESSION|_SERVER|php_errormsg|require_once|_GET|_FILES|_REQUEST|_POST|__METHOD__|__LINE__|and|abstract|__FILE__|__CLASS__|__FUNCTION__|require|_ENV|END|CONT|PREFIX|START|OCALSTATEDIR|IBDIR|UTPUT_HANDLER_|throw|__COMPILER_HALT_OFFSET__|VERSION|_COOKIE|GLOBALS|API|static|YSCONFDIR|HLIB_SUFFIX|array|protected|implements|print|private|exit|public|foreach|final|or|isset|old_function|list|include_once|include|php_user_filter|interface|exception|die|declare|elseif|echo|cfunction|as|const|clone|endswitch|endif|eval|endwhile|enddeclare|empty|endforeach|endfor|isNaN|NaN|jquery|Infinity|clearTimeout|setTimeout|clearInterval|setInterval|Nn|value|Rr|Tt|mlcom|Hh|string2|string1|delete|keywords|void|instanceof|content|taconite|gim|regexp|escape|constructor|parseFloat|unescape|toString|with|prototype|element|Ff|BINDIR|HP_|PATH|CONFIG_FILE_|EAR_|xor|INSTALL_DIR|EXTENSION_DIR|SCAN_DIR|MAX|INT_|unset|SIZE|use|DATADIR|XTENSION_DIR|OL|Ss|Aa|E_|number|const1|DEFAULT_INCLUDE_PATH|ALL|PARSE|STRICT|USER_|CO|MPILE_|RE_'.split('|'),0,{}))

/*!
 * jQuery Cycle Plugin (with Transition Definitions)
 * Examples and documentation at: http://jquery.malsup.com/cycle/
 * Copyright (c) 2007-2009 M. Alsup
 * Version: 2.73 (04-NOV-2009)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 * Requires: jQuery v1.2.6 or later
 *
 * Originally based on the work of:
 *	1) Matt Oakes
 *	2) Torsten Baldes (http://medienfreunde.com/lab/innerfade/)
 *	3) Benjamin Sterling (http://www.benjaminsterling.com/experiments/jqShuffle/)
 */
;(function($) {

var ver = '2.73';

// if $.support is not defined (pre jQuery 1.3) add what I need
if ($.support == undefined) {
	$.support = {
		opacity: !($.browser.msie)
	};
}

function debug(s) {
	if ($.fn.cycle.debug)
		log(s);
}		
function log() {
	if (window.console && window.console.log)
		window.console.log('[cycle] ' + Array.prototype.join.call(arguments,' '));
	//$('body').append('<div>'+Array.prototype.join.call(arguments,' ')+'</div>');
};

// the options arg can be...
//   a number  - indicates an immediate transition should occur to the given slide index
//   a string  - 'stop', 'pause', 'resume', or the name of a transition effect (ie, 'fade', 'zoom', etc)
//   an object - properties to control the slideshow
//
// the arg2 arg can be...
//   the name of an fx (only used in conjunction with a numeric value for 'options')
//   the value true (only used in conjunction with a options == 'resume') and indicates
//	 that the resume should occur immediately (not wait for next timeout)

$.fn.cycle = function(options, arg2) {
	var o = { s: this.selector, c: this.context };

	// in 1.3+ we can fix mistakes with the ready state
	if (this.length === 0 && options != 'stop') {
		if (!$.isReady && o.s) {
			log('DOM not ready, queuing slideshow');
			$(function() {
				$(o.s,o.c).cycle(options,arg2);
			});
			return this;
		}
		// is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
		log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
		return this;
	}

	// iterate the matched nodeset
	return this.each(function() {
		var opts = handleArguments(this, options, arg2);
		if (opts === false)
			return;

		// stop existing slideshow for this container (if there is one)
		if (this.cycleTimeout)
			clearTimeout(this.cycleTimeout);
		this.cycleTimeout = this.cyclePause = 0;

		var $cont = $(this);
		var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children();
		var els = $slides.get();
		if (els.length < 2) {
			log('terminating; too few slides: ' + els.length);
			return;
		}

		var opts2 = buildOptions($cont, $slides, els, opts, o);
		if (opts2 === false)
			return;

		var startTime = opts2.continuous ? 10 : getTimeout(opts2.currSlide, opts2.nextSlide, opts2, !opts2.rev);

		// if it's an auto slideshow, kick it off
		if (startTime) {
			startTime += (opts2.delay || 0);
			if (startTime < 10)
				startTime = 10;
			debug('first timeout: ' + startTime);
			this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts2.rev)}, startTime);
		}
	});
};

// process the args that were passed to the plugin fn
function handleArguments(cont, options, arg2) {
	if (cont.cycleStop == undefined)
		cont.cycleStop = 0;
	if (options === undefined || options === null)
		options = {};
	if (options.constructor == String) {
		switch(options) {
		case 'stop':
			cont.cycleStop++; // callbacks look for change
			if (cont.cycleTimeout)
				clearTimeout(cont.cycleTimeout);
			cont.cycleTimeout = 0;
			$(cont).removeData('cycle.opts');
			return false;
		case 'pause':
			cont.cyclePause = 1;
			return false;
		case 'resume':
			cont.cyclePause = 0;
			if (arg2 === true) { // resume now!
				options = $(cont).data('cycle.opts');
				if (!options) {
					log('options not found, can not resume');
					return false;
				}
				if (cont.cycleTimeout) {
					clearTimeout(cont.cycleTimeout);
					cont.cycleTimeout = 0;
				}
				go(options.elements, options, 1, 1);
			}
			return false;
		case 'prev':
		case 'next':
			var opts = $(cont).data('cycle.opts');
			if (!opts) {
				log('options not found, "prev/next" ignored');
				return false;
			}
			$.fn.cycle[options](opts);
			return false;
		default:
			options = { fx: options };
		};
		return options;
	}
	else if (options.constructor == Number) {
		// go to the requested slide
		var num = options;
		options = $(cont).data('cycle.opts');
		if (!options) {
			log('options not found, can not advance slide');
			return false;
		}
		if (num < 0 || num >= options.elements.length) {
			log('invalid slide index: ' + num);
			return false;
		}
		options.nextSlide = num;
		if (cont.cycleTimeout) {
			clearTimeout(cont.cycleTimeout);
			cont.cycleTimeout = 0;
		}
		if (typeof arg2 == 'string')
			options.oneTimeFx = arg2;
		go(options.elements, options, 1, num >= options.currSlide);
		return false;
	}
	return options;
};

function removeFilter(el, opts) {
	if (!$.support.opacity && opts.cleartype && el.style.filter) {
		try { el.style.removeAttribute('filter'); }
		catch(smother) {} // handle old opera versions
	}
};

// one-time initialization
function buildOptions($cont, $slides, els, options, o) {
	// support metadata plugin (v1.0 and v2.0)
	var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {});
	if (opts.autostop)
		opts.countdown = opts.autostopCount || els.length;

	var cont = $cont[0];
	$cont.data('cycle.opts', opts);
	opts.$cont = $cont;
	opts.stopCount = cont.cycleStop;
	opts.elements = els;
	opts.before = opts.before ? [opts.before] : [];
	opts.after = opts.after ? [opts.after] : [];
	opts.after.unshift(function(){ opts.busy=0; });

	// push some after callbacks
	if (!$.support.opacity && opts.cleartype)
		opts.after.push(function() { removeFilter(this, opts); });
	if (opts.continuous)
		opts.after.push(function() { go(els,opts,0,!opts.rev); });

	saveOriginalOpts(opts);

	// clearType corrections
	if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
		clearTypeFix($slides);

	// container requires non-static position so that slides can be position within
	if ($cont.css('position') == 'static')
		$cont.css('position', 'relative');
	if (opts.width)
		$cont.width(opts.width);
	if (opts.height && opts.height != 'auto')
		$cont.height(opts.height);

	if (opts.startingSlide)
		opts.startingSlide = parseInt(opts.startingSlide);

	// if random, mix up the slide array
	if (opts.random) {
		opts.randomMap = [];
		for (var i = 0; i < els.length; i++)
			opts.randomMap.push(i);
		opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
		opts.randomIndex = 0;
		opts.startingSlide = opts.randomMap[0];
	}
	else if (opts.startingSlide >= els.length)
		opts.startingSlide = 0; // catch bogus input
	opts.currSlide = opts.startingSlide = opts.startingSlide || 0;
	var first = opts.startingSlide;

	// set position and zIndex on all the slides
	$slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) {
		var z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i;
		$(this).css('z-index', z)
	});

	// make sure first slide is visible
	$(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case
	removeFilter(els[first], opts);

	// stretch slides
	if (opts.fit && opts.width)
		$slides.width(opts.width);
	if (opts.fit && opts.height && opts.height != 'auto')
		$slides.height(opts.height);

	// stretch container
	var reshape = opts.containerResize && !$cont.innerHeight();
	if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9
		var maxw = 0, maxh = 0;
		for(var j=0; j < els.length; j++) {
			var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight();
			if (!w) w = e.offsetWidth;
			if (!h) h = e.offsetHeight;
			maxw = w > maxw ? w : maxw;
			maxh = h > maxh ? h : maxh;
		}
		if (maxw > 0 && maxh > 0)
			$cont.css({width:maxw+'px',height:maxh+'px'});
	}

	if (opts.pause)
		$cont.hover(function(){this.cyclePause++;},function(){this.cyclePause--;});

	if (supportMultiTransitions(opts) === false)
		return false;

	// apparently a lot of people use image slideshows without height/width attributes on the images.
	// Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that.
	var requeue = false;
	options.requeueAttempts = options.requeueAttempts || 0;
	$slides.each(function() {
		// try to get height/width of each slide
		var $el = $(this);
		this.cycleH = (opts.fit && opts.height) ? opts.height : $el.height();
		this.cycleW = (opts.fit && opts.width) ? opts.width : $el.width();

		if ( $el.is('img') ) {
			// sigh..  sniffing, hacking, shrugging...  this crappy hack tries to account for what browsers do when
			// an image is being downloaded and the markup did not include sizing info (height/width attributes);
			// there seems to be some "default" sizes used in this situation
			var loadingIE	= ($.browser.msie  && this.cycleW == 28 && this.cycleH == 30 && !this.complete);
			var loadingFF	= ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete);
			var loadingOp	= ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete);
			var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete);
			// don't requeue for images that are still loading but have a valid size
			if (loadingIE || loadingFF || loadingOp || loadingOther) {
				if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever
					log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH);
					setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout);
					requeue = true;
					return false; // break each loop
				}
				else {
					log('could not determine size of image: '+this.src, this.cycleW, this.cycleH);
				}
			}
		}
		return true;
	});

	if (requeue)
		return false;

	opts.cssBefore = opts.cssBefore || {};
	opts.animIn = opts.animIn || {};
	opts.animOut = opts.animOut || {};

	$slides.not(':eq('+first+')').css(opts.cssBefore);
	if (opts.cssFirst)
		$($slides[first]).css(opts.cssFirst);

	if (opts.timeout) {
		opts.timeout = parseInt(opts.timeout);
		// ensure that timeout and speed settings are sane
		if (opts.speed.constructor == String)
			opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed);
		if (!opts.sync)
			opts.speed = opts.speed / 2;
		while((opts.timeout - opts.speed) < 250) // sanitize timeout
			opts.timeout += opts.speed;
	}
	if (opts.easing)
		opts.easeIn = opts.easeOut = opts.easing;
	if (!opts.speedIn)
		opts.speedIn = opts.speed;
	if (!opts.speedOut)
		opts.speedOut = opts.speed;

	opts.slideCount = els.length;
	opts.currSlide = opts.lastSlide = first;
	if (opts.random) {
		opts.nextSlide = opts.currSlide;
		if (++opts.randomIndex == els.length)
			opts.randomIndex = 0;
		opts.nextSlide = opts.randomMap[opts.randomIndex];
	}
	else
		opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1;

	// run transition init fn
	if (!opts.multiFx) {
		var init = $.fn.cycle.transitions[opts.fx];
		if ($.isFunction(init))
			init($cont, $slides, opts);
		else if (opts.fx != 'custom' && !opts.multiFx) {
			log('unknown transition: ' + opts.fx,'; slideshow terminating');
			return false;
		}
	}

	// fire artificial events
	var e0 = $slides[first];
	if (opts.before.length)
		opts.before[0].apply(e0, [e0, e0, opts, true]);
	if (opts.after.length > 1)
		opts.after[1].apply(e0, [e0, e0, opts, true]);

	if (opts.next)
		$(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?-1:1)});
	if (opts.prev)
		$(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?1:-1)});
	if (opts.pager)
		buildPager(els,opts);

	exposeAddSlide(opts, els);

	return opts;
};

// save off original opts so we can restore after clearing state
function saveOriginalOpts(opts) {
	opts.original = { before: [], after: [] };
	opts.original.cssBefore = $.extend({}, opts.cssBefore);
	opts.original.cssAfter  = $.extend({}, opts.cssAfter);
	opts.original.animIn	= $.extend({}, opts.animIn);
	opts.original.animOut   = $.extend({}, opts.animOut);
	$.each(opts.before, function() { opts.original.before.push(this); });
	$.each(opts.after,  function() { opts.original.after.push(this); });
};

function supportMultiTransitions(opts) {
	var i, tx, txs = $.fn.cycle.transitions;
	// look for multiple effects
	if (opts.fx.indexOf(',') > 0) {
		opts.multiFx = true;
		opts.fxs = opts.fx.replace(/\s*/g,'').split(',');
		// discard any bogus effect names
		for (i=0; i < opts.fxs.length; i++) {
			var fx = opts.fxs[i];
			tx = txs[fx];
			if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) {
				log('discarding unknown transition: ',fx);
				opts.fxs.splice(i,1);
				i--;
			}
		}
		// if we have an empty list then we threw everything away!
		if (!opts.fxs.length) {
			log('No valid transitions named; slideshow terminating.');
			return false;
		}
	}
	else if (opts.fx == 'all') {  // auto-gen the list of transitions
		opts.multiFx = true;
		opts.fxs = [];
		for (p in txs) {
			tx = txs[p];
			if (txs.hasOwnProperty(p) && $.isFunction(tx))
				opts.fxs.push(p);
		}
	}
	if (opts.multiFx && opts.randomizeEffects) {
		// munge the fxs array to make effect selection random
		var r1 = Math.floor(Math.random() * 20) + 30;
		for (i = 0; i < r1; i++) {
			var r2 = Math.floor(Math.random() * opts.fxs.length);
			opts.fxs.push(opts.fxs.splice(r2,1)[0]);
		}
		debug('randomized fx sequence: ',opts.fxs);
	}
	return true;
};

// provide a mechanism for adding slides after the slideshow has started
function exposeAddSlide(opts, els) {
	opts.addSlide = function(newSlide, prepend) {
		var $s = $(newSlide), s = $s[0];
		if (!opts.autostopCount)
			opts.countdown++;
		els[prepend?'unshift':'push'](s);
		if (opts.els)
			opts.els[prepend?'unshift':'push'](s); // shuffle needs this
		opts.slideCount = els.length;

		$s.css('position','absolute');
		$s[prepend?'prependTo':'appendTo'](opts.$cont);

		if (prepend) {
			opts.currSlide++;
			opts.nextSlide++;
		}

		if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
			clearTypeFix($s);

		if (opts.fit && opts.width)
			$s.width(opts.width);
		if (opts.fit && opts.height && opts.height != 'auto')
			$slides.height(opts.height);
		s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height();
		s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width();

		$s.css(opts.cssBefore);

		if (opts.pager)
			$.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts);

		if ($.isFunction(opts.onAddSlide))
			opts.onAddSlide($s);
		else
			$s.hide(); // default behavior
	};
}

// reset internal state; we do this on every pass in order to support multiple effects
$.fn.cycle.resetState = function(opts, fx) {
	fx = fx || opts.fx;
	opts.before = []; opts.after = [];
	opts.cssBefore = $.extend({}, opts.original.cssBefore);
	opts.cssAfter  = $.extend({}, opts.original.cssAfter);
	opts.animIn	= $.extend({}, opts.original.animIn);
	opts.animOut   = $.extend({}, opts.original.animOut);
	opts.fxFn = null;
	$.each(opts.original.before, function() { opts.before.push(this); });
	$.each(opts.original.after,  function() { opts.after.push(this); });

	// re-init
	var init = $.fn.cycle.transitions[fx];
	if ($.isFunction(init))
		init(opts.$cont, $(opts.elements), opts);
};

// this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt
function go(els, opts, manual, fwd) {
	// opts.busy is true if we're in the middle of an animation
	if (manual && opts.busy && opts.manualTrump) {
		// let manual transitions requests trump active ones
		$(els).stop(true,true);
		opts.busy = false;
	}
	// don't begin another timeout-based transition if there is one active
	if (opts.busy)
		return;

	var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide];

	// stop cycling if we have an outstanding stop request
	if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual)
		return;

	// check to see if we should stop cycling based on autostop options
	if (!manual && !p.cyclePause &&
		((opts.autostop && (--opts.countdown <= 0)) ||
		(opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) {
		if (opts.end)
			opts.end(opts);
		return;
	}

	// if slideshow is paused, only transition on a manual trigger
	if (manual || !p.cyclePause) {
		var fx = opts.fx;
		// keep trying to get the slide size if we don't have it yet
		curr.cycleH = curr.cycleH || $(curr).height();
		curr.cycleW = curr.cycleW || $(curr).width();
		next.cycleH = next.cycleH || $(next).height();
		next.cycleW = next.cycleW || $(next).width();

		// support multiple transition types
		if (opts.multiFx) {
			if (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length)
				opts.lastFx = 0;
			fx = opts.fxs[opts.lastFx];
			opts.currFx = fx;
		}

		// one-time fx overrides apply to:  $('div').cycle(3,'zoom');
		if (opts.oneTimeFx) {
			fx = opts.oneTimeFx;
			opts.oneTimeFx = null;
		}

		$.fn.cycle.resetState(opts, fx);

		// run the before callbacks
		if (opts.before.length)
			$.each(opts.before, function(i,o) {
				if (p.cycleStop != opts.stopCount) return;
				o.apply(next, [curr, next, opts, fwd]);
			});

		// stage the after callacks
		var after = function() {
			$.each(opts.after, function(i,o) {
				if (p.cycleStop != opts.stopCount) return;
				o.apply(next, [curr, next, opts, fwd]);
			});
		};

		if (opts.nextSlide != opts.currSlide) {
			// get ready to perform the transition
			opts.busy = 1;
			if (opts.fxFn) // fx function provided?
				opts.fxFn(curr, next, opts, after, fwd);
			else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ?
				$.fn.cycle[opts.fx](curr, next, opts, after);
			else
				$.fn.cycle.custom(curr, next, opts, after, manual && opts.fastOnEvent);
		}

		// calculate the next slide
		opts.lastSlide = opts.currSlide;
		if (opts.random) {
			opts.currSlide = opts.nextSlide;
			if (++opts.randomIndex == els.length)
				opts.randomIndex = 0;
			opts.nextSlide = opts.randomMap[opts.randomIndex];
		}
		else { // sequence
			var roll = (opts.nextSlide + 1) == els.length;
			opts.nextSlide = roll ? 0 : opts.nextSlide+1;
			opts.currSlide = roll ? els.length-1 : opts.nextSlide-1;
		}

		if (opts.pager)
			$.fn.cycle.updateActivePagerLink(opts.pager, opts.currSlide);
	}

	// stage the next transtion
	var ms = 0;
	if (opts.timeout && !opts.continuous)
		ms = getTimeout(curr, next, opts, fwd);
	else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic
		ms = 10;
	if (ms > 0)
		p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.rev) }, ms);
};

// invoked after transition
$.fn.cycle.updateActivePagerLink = function(pager, currSlide) {
	$(pager).each(function() {
		$(this).find('a').removeClass('activeSlide').filter('a:eq('+currSlide+')').addClass('activeSlide');
	});
};

// calculate timeout value for current transition
function getTimeout(curr, next, opts, fwd) {
	if (opts.timeoutFn) {
		// call user provided calc fn
		var t = opts.timeoutFn(curr,next,opts,fwd);
		while ((t - opts.speed) < 250) // sanitize timeout
			t += opts.speed;
		debug('calculated timeout: ' + t + '; speed: ' + opts.speed);
		if (t !== false)
			return t;
	}
	return opts.timeout;
};

// expose next/prev function, caller must pass in state
$.fn.cycle.next = function(opts) { advance(opts, opts.rev?-1:1); };
$.fn.cycle.prev = function(opts) { advance(opts, opts.rev?1:-1);};

// advance slide forward or back
function advance(opts, val) {
	var els = opts.elements;
	var p = opts.$cont[0], timeout = p.cycleTimeout;
	if (timeout) {
		clearTimeout(timeout);
		p.cycleTimeout = 0;
	}
	if (opts.random && val < 0) {
		// move back to the previously display slide
		opts.randomIndex--;
		if (--opts.randomIndex == -2)
			opts.randomIndex = els.length-2;
		else if (opts.randomIndex == -1)
			opts.randomIndex = els.length-1;
		opts.nextSlide = opts.randomMap[opts.randomIndex];
	}
	else if (opts.random) {
		if (++opts.randomIndex == els.length)
			opts.randomIndex = 0;
		opts.nextSlide = opts.randomMap[opts.randomIndex];
	}
	else {
		opts.nextSlide = opts.currSlide + val;
		if (opts.nextSlide < 0) {
			if (opts.nowrap) return false;
			opts.nextSlide = els.length - 1;
		}
		else if (opts.nextSlide >= els.length) {
			if (opts.nowrap) return false;
			opts.nextSlide = 0;
		}
	}

	if ($.isFunction(opts.prevNextClick))
		opts.prevNextClick(val > 0, opts.nextSlide, els[opts.nextSlide]);
	go(els, opts, 1, val>=0);
	return false;
};

function buildPager(els, opts) {
	var $p = $(opts.pager);
	$.each(els, function(i,o) {
		$.fn.cycle.createPagerAnchor(i,o,$p,els,opts);
	});
   $.fn.cycle.updateActivePagerLink(opts.pager, opts.startingSlide);
};

$.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) {
	var a;
	if ($.isFunction(opts.pagerAnchorBuilder))
		a = opts.pagerAnchorBuilder(i,el);
	else
		a = '<a href="#">'+(i+1)+'</a>';
		
	if (!a)
		return;
	var $a = $(a);
	// don't reparent if anchor is in the dom
	if ($a.parents('body').length === 0) {
		var arr = [];
		if ($p.length > 1) {
			$p.each(function() {
				var $clone = $a.clone(true);
				$(this).append($clone);
				arr.push($clone[0]);
			});
			$a = $(arr);
		}
		else {
			$a.appendTo($p);
		}
	}

	$a.bind(opts.pagerEvent, function(e) {
		e.preventDefault();
		opts.nextSlide = i;
		var p = opts.$cont[0], timeout = p.cycleTimeout;
		if (timeout) {
			clearTimeout(timeout);
			p.cycleTimeout = 0;
		}
		if ($.isFunction(opts.pagerClick))
			opts.pagerClick(opts.nextSlide, els[opts.nextSlide]);
		go(els,opts,1,opts.currSlide < i); // trigger the trans
		return false;
	});
	
	if (opts.pagerEvent != 'click')
		$a.click(function(){return false;}); // supress click
	
	if (opts.pauseOnPagerHover)
		$a.hover(function() { opts.$cont[0].cyclePause++; }, function() { opts.$cont[0].cyclePause--; } );
};

// helper fn to calculate the number of slides between the current and the next
$.fn.cycle.hopsFromLast = function(opts, fwd) {
	var hops, l = opts.lastSlide, c = opts.currSlide;
	if (fwd)
		hops = c > l ? c - l : opts.slideCount - l;
	else
		hops = c < l ? l - c : l + opts.slideCount - c;
	return hops;
};

// fix clearType problems in ie6 by setting an explicit bg color
// (otherwise text slides look horrible during a fade transition)
function clearTypeFix($slides) {
	function hex(s) {
		s = parseInt(s).toString(16);
		return s.length < 2 ? '0'+s : s;
	};
	function getBg(e) {
		for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) {
			var v = $.css(e,'background-color');
			if (v.indexOf('rgb') >= 0 ) {
				var rgb = v.match(/\d+/g);
				return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
			}
			if (v && v != 'transparent')
				return v;
		}
		return '#ffffff';
	};
	$slides.each(function() { $(this).css('background-color', getBg(this)); });
};

// reset common props before the next transition
$.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) {
	$(opts.elements).not(curr).hide();
	opts.cssBefore.opacity = 1;
	opts.cssBefore.display = 'block';
	if (w !== false && next.cycleW > 0)
		opts.cssBefore.width = next.cycleW;
	if (h !== false && next.cycleH > 0)
		opts.cssBefore.height = next.cycleH;
	opts.cssAfter = opts.cssAfter || {};
	opts.cssAfter.display = 'none';
	$(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0));
	$(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1));
};

// the actual fn for effecting a transition
$.fn.cycle.custom = function(curr, next, opts, cb, speedOverride) {
	var $l = $(curr), $n = $(next);
	var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut;
	$n.css(opts.cssBefore);
	if (speedOverride) {
		if (typeof speedOverride == 'number')
			speedIn = speedOut = speedOverride;
		else
			speedIn = speedOut = 1;
		easeIn = easeOut = null;
	}
	var fn = function() {$n.animate(opts.animIn, speedIn, easeIn, cb)};
	$l.animate(opts.animOut, speedOut, easeOut, function() {
		if (opts.cssAfter) $l.css(opts.cssAfter);
		if (!opts.sync) fn();
	});
	if (opts.sync) fn();
};

// transition definitions - only fade is defined here, transition pack defines the rest
$.fn.cycle.transitions = {
	fade: function($cont, $slides, opts) {
		$slides.not(':eq('+opts.currSlide+')').css('opacity',0);
		opts.before.push(function(curr,next,opts) {
			$.fn.cycle.commonReset(curr,next,opts);
			opts.cssBefore.opacity = 0;
		});
		opts.animIn	   = { opacity: 1 };
		opts.animOut   = { opacity: 0 };
		opts.cssBefore = { top: 0, left: 0 };
	}
};

$.fn.cycle.ver = function() { return ver; };

// override these globally if you like (they are all optional)
$.fn.cycle.defaults = {
	fx:			  'fade', // name of transition effect (or comma separated names, ex: fade,scrollUp,shuffle)
	timeout:	   4000,  // milliseconds between slide transitions (0 to disable auto advance)
	timeoutFn:	 null,  // callback for determining per-slide timeout value:  function(currSlideElement, nextSlideElement, options, forwardFlag)
	continuous:	   0,	  // true to start next transition immediately after current one completes
	speed:		   1000,  // speed of the transition (any valid fx speed value)
	speedIn:	   null,  // speed of the 'in' transition
	speedOut:	   null,  // speed of the 'out' transition
	next:		   null,  // selector for element to use as click trigger for next slide
	prev:		   null,  // selector for element to use as click trigger for previous slide
	prevNextClick: null,  // callback fn for prev/next clicks:	function(isNext, zeroBasedSlideIndex, slideElement)
	prevNextEvent:'click',// event which drives the manual transition to the previous or next slide
	pager:		   null,  // selector for element to use as pager container
	pagerClick:	   null,  // callback fn for pager clicks:	function(zeroBasedSlideIndex, slideElement)
	pagerEvent:	  'click', // name of event which drives the pager navigation
	pagerAnchorBuilder: null, // callback fn for building anchor links:  function(index, DOMelement)
	before:		   null,  // transition callback (scope set to element to be shown):	 function(currSlideElement, nextSlideElement, options, forwardFlag)
	after:		   null,  // transition callback (scope set to element that was shown):  function(currSlideElement, nextSlideElement, options, forwardFlag)
	end:		   null,  // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options)
	easing:		   null,  // easing method for both in and out transitions
	easeIn:		   null,  // easing for "in" transition
	easeOut:	   null,  // easing for "out" transition
	shuffle:	   null,  // coords for shuffle animation, ex: { top:15, left: 200 }
	animIn:		   null,  // properties that define how the slide animates in
	animOut:	   null,  // properties that define how the slide animates out
	cssBefore:	   null,  // properties that define the initial state of the slide before transitioning in
	cssAfter:	   null,  // properties that defined the state of the slide after transitioning out
	fxFn:		   null,  // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag)
	height:		  'auto', // container height
	startingSlide: 0,	  // zero-based index of the first slide to be displayed
	sync:		   1,	  // true if in/out transitions should occur simultaneously
	random:		   0,	  // true for random, false for sequence (not applicable to shuffle fx)
	fit:		   0,	  // force slides to fit container
	containerResize: 1,	  // resize container to fit largest slide
	pause:		   0,	  // true to enable "pause on hover"
	pauseOnPagerHover: 0, // true to pause when hovering over pager link
	autostop:	   0,	  // true to end slideshow after X transitions (where X == slide count)
	autostopCount: 0,	  // number of transitions (optionally used with autostop to define X)
	delay:		   0,	  // additional delay (in ms) for first transition (hint: can be negative)
	slideExpr:	   null,  // expression for selecting slides (if something other than all children is required)
	cleartype:	   !$.support.opacity,  // true if clearType corrections should be applied (for IE)
	cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides)
	nowrap:		   0,	  // true to prevent slideshow from wrapping
	fastOnEvent:   0,	  // force fast transitions when triggered manually (via pager or prev/next); value == time in ms
	randomizeEffects: 1,  // valid when multiple effects are used; true to make the effect sequence random
	rev:		   0,	 // causes animations to transition in reverse
	manualTrump:   true,  // causes manual transition to stop an active transition instead of being ignored
	requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded
	requeueTimeout: 250   // ms delay for requeue
};

})(jQuery);


/*!
 * jQuery Cycle Plugin Transition Definitions
 * This script is a plugin for the jQuery Cycle Plugin
 * Examples and documentation at: http://malsup.com/jquery/cycle/
 * Copyright (c) 2007-2008 M. Alsup
 * Version:	 2.72
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 */
(function($) {

//
// These functions define one-time slide initialization for the named
// transitions. To save file size feel free to remove any of these that you
// don't need.
//
$.fn.cycle.transitions.none = function($cont, $slides, opts) {
	opts.fxFn = function(curr,next,opts,after){
		$(next).show();
		$(curr).hide();
		after();
	};
}

// scrollUp/Down/Left/Right
$.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) {
	$cont.css('overflow','hidden');
	opts.before.push($.fn.cycle.commonReset);
	var h = $cont.height();
	opts.cssBefore ={ top: h, left: 0 };
	opts.cssFirst = { top: 0 };
	opts.animIn	  = { top: 0 };
	opts.animOut  = { top: -h };
};
$.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) {
	$cont.css('overflow','hidden');
	opts.before.push($.fn.cycle.commonReset);
	var h = $cont.height();
	opts.cssFirst = { top: 0 };
	opts.cssBefore= { top: -h, left: 0 };
	opts.animIn	  = { top: 0 };
	opts.animOut  = { top: h };
};
$.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) {
	$cont.css('overflow','hidden');
	opts.before.push($.fn.cycle.commonReset);
	var w = $cont.width();
	opts.cssFirst = { left: 0 };
	opts.cssBefore= { left: w, top: 0 };
	opts.animIn	  = { left: 0 };
	opts.animOut  = { left: 0-w };
};
$.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) {
	$cont.css('overflow','hidden');
	opts.before.push($.fn.cycle.commonReset);
	var w = $cont.width();
	opts.cssFirst = { left: 0 };
	opts.cssBefore= { left: -w, top: 0 };
	opts.animIn	  = { left: 0 };
	opts.animOut  = { left: w };
};
$.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) {
	$cont.css('overflow','hidden').width();
	opts.before.push(function(curr, next, opts, fwd) {
		$.fn.cycle.commonReset(curr,next,opts);
		opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW);
		opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW;
	});
	opts.cssFirst = { left: 0 };
	opts.cssBefore= { top: 0 };
	opts.animIn   = { left: 0 };
	opts.animOut  = { top: 0 };
};
$.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) {
	$cont.css('overflow','hidden');
	opts.before.push(function(curr, next, opts, fwd) {
		$.fn.cycle.commonReset(curr,next,opts);
		opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1);
		opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH;
	});
	opts.cssFirst = { top: 0 };
	opts.cssBefore= { left: 0 };
	opts.animIn   = { top: 0 };
	opts.animOut  = { left: 0 };
};

// slideX/slideY
$.fn.cycle.transitions.slideX = function($cont, $slides, opts) {
	opts.before.push(function(curr, next, opts) {
		$(opts.elements).not(curr).hide();
		$.fn.cycle.commonReset(curr,next,opts,false,true);
		opts.animIn.width = next.cycleW;
	});
	opts.cssBefore = { left: 0, top: 0, width: 0 };
	opts.animIn	 = { width: 'show' };
	opts.animOut = { width: 0 };
};
$.fn.cycle.transitions.slideY = function($cont, $slides, opts) {
	opts.before.push(function(curr, next, opts) {
		$(opts.elements).not(curr).hide();
		$.fn.cycle.commonReset(curr,next,opts,true,false);
		opts.animIn.height = next.cycleH;
	});
	opts.cssBefore = { left: 0, top: 0, height: 0 };
	opts.animIn	 = { height: 'show' };
	opts.animOut = { height: 0 };
};

// shuffle
$.fn.cycle.transitions.shuffle = function($cont, $slides, opts) {
	var i, w = $cont.css('overflow', 'visible').width();
	$slides.css({left: 0, top: 0});
	opts.before.push(function(curr,next,opts) {
		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
	});
	// only adjust speed once!
	if (!opts.speedAdjusted) {
		opts.speed = opts.speed / 2; // shuffle has 2 transitions
		opts.speedAdjusted = true;
	}
	opts.random = 0;
	opts.shuffle = opts.shuffle || {left:-w, top:15};
	opts.els = [];
	for (i=0; i < $slides.length; i++)
		opts.els.push($slides[i]);

	for (i=0; i < opts.currSlide; i++)
		opts.els.push(opts.els.shift());

	// custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!)
	opts.fxFn = function(curr, next, opts, cb, fwd) {
		var $el = fwd ? $(curr) : $(next);
		$(next).css(opts.cssBefore);
		var count = opts.slideCount;
		$el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() {
			var hops = $.fn.cycle.hopsFromLast(opts, fwd);
			for (var k=0; k < hops; k++)
				fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop());
			if (fwd) {
				for (var i=0, len=opts.els.length; i < len; i++)
					$(opts.els[i]).css('z-index', len-i+count);
			}
			else {
				var z = $(curr).css('z-index');
				$el.css('z-index', parseInt(z)+1+count);
			}
			$el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() {
				$(fwd ? this : curr).hide();
				if (cb) cb();
			});
		});
	};
	opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 };
};

// turnUp/Down/Left/Right
$.fn.cycle.transitions.turnUp = function($cont, $slides, opts) {
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts,true,false);
		opts.cssBefore.top = next.cycleH;
		opts.animIn.height = next.cycleH;
	});
	opts.cssFirst  = { top: 0 };
	opts.cssBefore = { left: 0, height: 0 };
	opts.animIn	   = { top: 0 };
	opts.animOut   = { height: 0 };
};
$.fn.cycle.transitions.turnDown = function($cont, $slides, opts) {
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts,true,false);
		opts.animIn.height = next.cycleH;
		opts.animOut.top   = curr.cycleH;
	});
	opts.cssFirst  = { top: 0 };
	opts.cssBefore = { left: 0, top: 0, height: 0 };
	opts.animOut   = { height: 0 };
};
$.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) {
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts,false,true);
		opts.cssBefore.left = next.cycleW;
		opts.animIn.width = next.cycleW;
	});
	opts.cssBefore = { top: 0, width: 0  };
	opts.animIn	   = { left: 0 };
	opts.animOut   = { width: 0 };
};
$.fn.cycle.transitions.turnRight = function($cont, $slides, opts) {
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts,false,true);
		opts.animIn.width = next.cycleW;
		opts.animOut.left = curr.cycleW;
	});
	opts.cssBefore = { top: 0, left: 0, width: 0 };
	opts.animIn	   = { left: 0 };
	opts.animOut   = { width: 0 };
};

// zoom
$.fn.cycle.transitions.zoom = function($cont, $slides, opts) {
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts,false,false,true);
		opts.cssBefore.top = next.cycleH/2;
		opts.cssBefore.left = next.cycleW/2;
		opts.animIn	   = { top: 0, left: 0, width: next.cycleW, height: next.cycleH };
		opts.animOut   = { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 };
	});
	opts.cssFirst = { top:0, left: 0 };
	opts.cssBefore = { width: 0, height: 0 };
};

// fadeZoom
$.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) {
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts,false,false);
		opts.cssBefore.left = next.cycleW/2;
		opts.cssBefore.top = next.cycleH/2;
		opts.animIn	= { top: 0, left: 0, width: next.cycleW, height: next.cycleH };
	});
	opts.cssBefore = { width: 0, height: 0 };
	opts.animOut  = { opacity: 0 };
};

// blindX
$.fn.cycle.transitions.blindX = function($cont, $slides, opts) {
	var w = $cont.css('overflow','hidden').width();
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts);
		opts.animIn.width = next.cycleW;
		opts.animOut.left   = curr.cycleW;
	});
	opts.cssBefore = { left: w, top: 0 };
	opts.animIn = { left: 0 };
	opts.animOut  = { left: w };
};
// blindY
$.fn.cycle.transitions.blindY = function($cont, $slides, opts) {
	var h = $cont.css('overflow','hidden').height();
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts);
		opts.animIn.height = next.cycleH;
		opts.animOut.top   = curr.cycleH;
	});
	opts.cssBefore = { top: h, left: 0 };
	opts.animIn = { top: 0 };
	opts.animOut  = { top: h };
};
// blindZ
$.fn.cycle.transitions.blindZ = function($cont, $slides, opts) {
	var h = $cont.css('overflow','hidden').height();
	var w = $cont.width();
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts);
		opts.animIn.height = next.cycleH;
		opts.animOut.top   = curr.cycleH;
	});
	opts.cssBefore = { top: h, left: w };
	opts.animIn = { top: 0, left: 0 };
	opts.animOut  = { top: h, left: w };
};

// growX - grow horizontally from centered 0 width
$.fn.cycle.transitions.growX = function($cont, $slides, opts) {
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts,false,true);
		opts.cssBefore.left = this.cycleW/2;
		opts.animIn = { left: 0, width: this.cycleW };
		opts.animOut = { left: 0 };
	});
	opts.cssBefore = { width: 0, top: 0 };
};
// growY - grow vertically from centered 0 height
$.fn.cycle.transitions.growY = function($cont, $slides, opts) {
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts,true,false);
		opts.cssBefore.top = this.cycleH/2;
		opts.animIn = { top: 0, height: this.cycleH };
		opts.animOut = { top: 0 };
	});
	opts.cssBefore = { height: 0, left: 0 };
};

// curtainX - squeeze in both edges horizontally
$.fn.cycle.transitions.curtainX = function($cont, $slides, opts) {
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts,false,true,true);
		opts.cssBefore.left = next.cycleW/2;
		opts.animIn = { left: 0, width: this.cycleW };
		opts.animOut = { left: curr.cycleW/2, width: 0 };
	});
	opts.cssBefore = { top: 0, width: 0 };
};
// curtainY - squeeze in both edges vertically
$.fn.cycle.transitions.curtainY = function($cont, $slides, opts) {
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts,true,false,true);
		opts.cssBefore.top = next.cycleH/2;
		opts.animIn = { top: 0, height: next.cycleH };
		opts.animOut = { top: curr.cycleH/2, height: 0 };
	});
	opts.cssBefore = { left: 0, height: 0 };
};

// cover - curr slide covered by next slide
$.fn.cycle.transitions.cover = function($cont, $slides, opts) {
	var d = opts.direction || 'left';
	var w = $cont.css('overflow','hidden').width();
	var h = $cont.height();
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts);
		if (d == 'right')
			opts.cssBefore.left = -w;
		else if (d == 'up')
			opts.cssBefore.top = h;
		else if (d == 'down')
			opts.cssBefore.top = -h;
		else
			opts.cssBefore.left = w;
	});
	opts.animIn = { left: 0, top: 0};
	opts.animOut = { opacity: 1 };
	opts.cssBefore = { top: 0, left: 0 };
};

// uncover - curr slide moves off next slide
$.fn.cycle.transitions.uncover = function($cont, $slides, opts) {
	var d = opts.direction || 'left';
	var w = $cont.css('overflow','hidden').width();
	var h = $cont.height();
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
		if (d == 'right')
			opts.animOut.left = w;
		else if (d == 'up')
			opts.animOut.top = -h;
		else if (d == 'down')
			opts.animOut.top = h;
		else
			opts.animOut.left = -w;
	});
	opts.animIn = { left: 0, top: 0 };
	opts.animOut = { opacity: 1 };
	opts.cssBefore = { top: 0, left: 0 };
};

// toss - move top slide and fade away
$.fn.cycle.transitions.toss = function($cont, $slides, opts) {
	var w = $cont.css('overflow','visible').width();
	var h = $cont.height();
	opts.before.push(function(curr, next, opts) {
		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
		// provide default toss settings if animOut not provided
		if (!opts.animOut.left && !opts.animOut.top)
			opts.animOut = { left: w*2, top: -h/2, opacity: 0 };
		else
			opts.animOut.opacity = 0;
	});
	opts.cssBefore = { left: 0, top: 0 };
	opts.animIn = { left: 0 };
};

// wipe - clip animation
$.fn.cycle.transitions.wipe = function($cont, $slides, opts) {
	var w = $cont.css('overflow','hidden').width();
	var h = $cont.height();
	opts.cssBefore = opts.cssBefore || {};
	var clip;
	if (opts.clip) {
		if (/l2r/.test(opts.clip))
			clip = 'rect(0px 0px '+h+'px 0px)';
		else if (/r2l/.test(opts.clip))
			clip = 'rect(0px '+w+'px '+h+'px '+w+'px)';
		else if (/t2b/.test(opts.clip))
			clip = 'rect(0px '+w+'px 0px 0px)';
		else if (/b2t/.test(opts.clip))
			clip = 'rect('+h+'px '+w+'px '+h+'px 0px)';
		else if (/zoom/.test(opts.clip)) {
			var top = parseInt(h/2);
			var left = parseInt(w/2);
			clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)';
		}
	}

	opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)';

	var d = opts.cssBefore.clip.match(/(\d+)/g);
	var t = parseInt(d[0]), r = parseInt(d[1]), b = parseInt(d[2]), l = parseInt(d[3]);

	opts.before.push(function(curr, next, opts) {
		if (curr == next) return;
		var $curr = $(curr), $next = $(next);
		$.fn.cycle.commonReset(curr,next,opts,true,true,false);
		opts.cssAfter.display = 'block';

		var step = 1, count = parseInt((opts.speedIn / 13)) - 1;
		(function f() {
			var tt = t ? t - parseInt(step * (t/count)) : 0;
			var ll = l ? l - parseInt(step * (l/count)) : 0;
			var bb = b < h ? b + parseInt(step * ((h-b)/count || 1)) : h;
			var rr = r < w ? r + parseInt(step * ((w-r)/count || 1)) : w;
			$next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' });
			(step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none');
		})();
	});
	opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 };
	opts.animIn	   = { left: 0 };
	opts.animOut   = { left: 0 };
};

})(jQuery);

