/*
 * glyde for jQuery
 * by Daniel Sentker
 * @version 1.11
 * 18.01.2010
 * http://www.shiftedwork.de
 *
 * Copyright (c) 2011 Daniel Sentker
 * Dual licensed under the MIT and GPL licenses.
 *
 * Changelog
 *
 *      v 1.1
 *      - improved url trim (no bugs anymore...)
 *      - title tag is read from injected file
 *      - added onClick callback
 *      - renamed a few vars
 *
 *      v 1.0:
 *      - added support for back-button from browser (thanks Ben Alman)
 *      - improved error handling
 *      - improved several lines.. :)
 *
 *      v 0.8
 *      - added error Handler callback
 *      - added hash divider to inject elements with no IDs
 *      - selecting a link with glyde in a already injected page works now (live mode)
 *      - glyde is trimming long urls automatically
 *      - created a cool overlay-loading-div :)
 *
 *      v 0.5
 *      - glyde is generating classes during injection process
 *      - glyde is able to read current hash to load the req. page
 *      - added the default-hash-option (if no hash is set)
 *
 *      v 0.1
 *      - basic idea developed, many bugs (:
 *
 */
(function($){
    $.fn.extend({
        glyde: function(options) {

            var errorHandler = function(frame, xhr) {
                $(frame).text('Error 404');
            }

            var onClickHandler = function(anchor, trigger, targetframe) {
                $(trigger).removeClass('current');
                $(anchor).addClass('current');
            }
            
            var defaults = {
                trigger:        'a',
                container:      '',
                trim:           true,
                readHash:       true,
                errorHandler:   errorHandler,
                onClickHandler: onClickHandler,
                timeout:        9000
            };

            var o =  $.extend(defaults, options);
            var loadTo = this;

            $(loadTo).css('position', 'relative').addClass('glyde-ready');

            function lock() {
                $(loadTo).addClass('glyde-locked').removeClass('glyde-ready').css('cursor', 'wait').prepend('<div class="glyde-loading">&nbsp;</div>');
            }

            function release() {
                $(loadTo).css('cursor', 'auto').addClass('glyde-ready').removeClass('glyde-locked');
                $('.glyde-loading').remove();
            }

            function readHash() {
                if(window.location.hash && o.readHash) {
                    var hash = window.location.hash.substr(1).split('#');
                    var container = (hash[1]) ? '#'+hash[1] : o.container;
                    inject(hash[0], container);
                }
            }
            readHash();

            function inject(file, selector) {
                $.ajax({
                    url:        file,
                    dataType:   'html',
                    timeout:    o.timeout,
                    success: function(data) {
                        var result = $('<div />').append(data);
                        document.title = result.find('title').text();
                        $(loadTo).html(result.find(selector).contents());
                        release();
                    },
                    error: function(xhr){
                        o.errorHandler.call(this, loadTo, xhr);
                        release();
                    },
                    beforeSend: function(data){
                      lock();
                    }
                });
            }

            $(o.trigger).live('click',function(event) {
                var link = $(this);
                o.onClickHandler.call(this, link, o.trigger, loadTo);
                var target_file = link.attr('href').replace(link.attr('hash'), '');
                var target_box = (!link.attr('hash')) ? o.container : link.attr('hash');

                if(o.trim) 
                    target_file = target_file.replace(location.protocol + '//' + location.host, '');
                if(!o.readHash)
                    inject(target_file, target_box);
                $(location).attr("hash", target_file+target_box);
                event.preventDefault();
                
            });

            $(window).hashchange(readHash);
        }
    });
})(jQuery);

/*
 * jQuery hashchange event - v1.3 - 7/21/2010
 * http://benalman.com/projects/jquery-hashchange-plugin/
 *
 * Copyright (c) 2010 "Cowboy" Ben Alman
 * Dual licensed under the MIT and GPL licenses.
 * http://benalman.com/about/license/
 */
(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);

