/* Clone function */

function clone(object){
    function F(){}
    F.prototype = object;
    return new F;
}

jQuery.extend({
    oGrep : function(elems,obj_key,obj_val,return_objects){
        var ret = [];
        for(var i in elems){
            if(elems[i].hasOwnProperty(obj_key)){
                if(typeof obj_val != "undefined"){
                    if(elems[i][obj_key]==obj_val){
                        if(return_objects){
                            ret.push(elems[i]);
                        }else{
                            ret.push(elems[i][obj_key]);
                        }
                    }
                }else{
                    if(return_objects){
                        ret.push(elems[i]);
                    }else{
                        ret.push(elems[i][obj_key]);
                    }
                }
            }
        }
        return ret;
    },
    center : function(elem,offset_parent){
        //offsetParent() only works for visible items - sometimes we want to position something before it's shown
        var parent = offset_parent ? offset_parent : elem.offsetParent();
        var pw = parent.width();
        var ph = parent.height();
        var eh = elem.height();
        var ew = elem.width();
        var et = 0;
        var el = 0;
        if(ew > pw && eh > ph){
            et = ph/2 - eh/2;
            el = pw/2 - ew/2;
        }else{
            et = ph/2 - eh/2;
            el = pw/2 - ew/2;
        }
        if(parent.selector=="document"){
            et += jQuery(window).scrollTop();
            el += jQuery(window).scrollLeft();
        }
        jQuery(elem).css({top:et,left:el,position:"absolute"});
    }
});

CommunicationManager = (function(){
    return {
        requests: {},
        get: function(url, data, callback) {
            if(typeof CommunicationManager["requests"][url]=="undefined"){
                CommunicationManager["requests"][url] = $.get(
                    url,
                    data,
                    function(data,textStatus){
                        delete CommunicationManager["requests"][url];
                        if(typeof callback == "function"){
                            callback.call($(this),data,textStatus);
                        }
                    }
                );
            }else{
                return false;
            }
        },

        post: function(url, data, callback, type) {
            var data_type = type || "html";
            if(typeof CommunicationManager["requests"][url]=="undefined"){
                CommunicationManager["requests"][url] = $.post(
                    url,
                    data,
                    function(data,textStatus){
                        delete CommunicationManager["requests"][url];
                        if(typeof callback == "function"){
                            callback.call($(this),data,textStatus);
                        }
                    },
                    data_type
                );
                return CommunicationManager["requests"][url];
            }else{
                return false;
            }
        },

        prepareForm: function(formname, url, callback, type) {
            var request_type = typeof type != "undefined" ? type : "POST";
            $("form[name=" + formname + "]").bind('submit',
                { "url": url,
                  "callback": callback,
                  "name": formname,
                  "request_type": request_type },
                CommunicationManager.postForm);
        },

        postForm: function(e) {
            var form = this;
            var data = new Object;

            e.preventDefault();
            if(typeof CommunicationManager["requests"][e.data["url"]]=="undefined"){
                $(form).find(":submit").each( function(i) {
                    if($(this).is(":visible")){
                        // Disable and add a little throbber
                        this.disabled = true;
                        $('<div><img src="/icons/busy.gif" width="16"></div>')
                            .addClass("throbbersm")
                            .css("padding-left", "5px")
                            .css("display", "inline")
                            .insertAfter( $(this) );
                    }
                } );

                $(form).find(".submitter").each( function(i) {
                    $('<img class="busy" src="/images/busy_dark.gif" alt="working..." />')
                        .appendTo( $(this) );
                } );

                for (var i=0; i<form.elements.length; ++i) {
                    var el = form.elements[i];
                    switch(el.type) {
                        case "text":
                        case "password":
                        case "hidden":
                            data[ el.name ] = el.value;
                            break;
                        case "checkbox":
                            if (el.checked)
                                data[ el.name ] = el.value;
                            break;
                        default:
                            if (el.tagName.toLowerCase() == 'textarea')
                                data[ el.name ] = el.value;
                            else if (el.tagName.toLowerCase() == 'select')
                                data[ el.name ] = el.options[el.selectedIndex].value;
                    }
                }

                var name = e.data.name;
                var callback = e.data.callback;

                CommunicationManager["requests"][e.data["url"]] = $.ajax({
                    type: e.data["request_type"],
                    url: e.data["url"],
                    data: data,
                    success: function(data, status) {
                        delete CommunicationManager.requests[e.data['url']];
                        CommunicationManager.showFormSuccess(data, status, name, form, callback);
                    },
                    error: function(data, status, err) {
                        delete CommunicationManager.requests[e.data['url']];
                        CommunicationManager.showFormError("error", false, name, form)
                    }
                 });
                return CommunicationManager["requests"][e.data["url"]];
            }else{
                return false;
            }
        },

        showFormSuccess: function(data, status, name, form, callback) {
            if (form) {
                $(form).find(":submit").each( function(i) {
                    this.disabled = false;
                } );
                $(form).find(".throbbersm").remove();
                $(form).find("label").parent().removeClass("missed");
            }

            var elem = data.documentElement;
            if (elem && elem.tagName == 'result') {
                var error_msg = elem.getAttribute('error_msg');
                var missed = elem.getAttribute('missed');
                var success = elem.getAttribute('success');
                if (error_msg) {
                    CommunicationManager.showFormError(error_msg, missed, name, form);
                } else {
                    if (success) {
                        $("div.error").css("display","none");
                        $("input.missed",$(form)).removeClass("missed");
                        $("#" + name + "_success").clone().removeClass("display_none").dialog({
                            buttons: { "Close": function() { $(this).dialog("close"); } },
                            resizable: false,
                            title: 'Success!',
                            show: "slide",
                            hide: "clip",
                            position: ["center",200],
                            open: function(){
                                var that = $(this);
                                setTimeout(function(){
                                    that.dialog('close');
                                },10000);
                            },
                            close: function(){
                                $(this).dialog('destroy').remove();
                            }
                        });
                        window.scrollTo(0,0);
                    }
                }
            }

            if (callback)
                callback(data, status);
        },

        showFormError: function(msg, missed, name, form) {
            if (form) {
                $(":submit",$(form)).each( function(i) {
                    this.disabled = false;
                } );
                $(".throbbersm",$(form)).remove();

                $("label",$(form)).removeClass("missed");
                if (missed) {
                    missed = missed.split(",");
                    for (i=0; i<missed.length; ++i) {
                        var m = missed[i];
                        $("label[for$=" + m + "], input[name="+m+"]",$(form)).addClass("missed");
                    }
                }
            }

            if (msg) {
                $("#" + name + "_success").hide();
                $("div.error").css("display","none");
                $("#" + name + "_errormsg_" + msg).clone().attr("id",name + "_errormsg_" + msg + "_dialog").removeClass("error").dialog({
                    buttons: { "Close": function() { $(this).dialog("close"); } },
                    resizable: false,
                    width:325,
                    title: 'There was a problem with your request',
                    show: "slide",
                    hide: "clip",
                    position: ["center",200],
                    open: function(){
                        var that = $(this);
                        setTimeout(function(){
                            that.dialog('close');
                        },10000);
                    },
                    close: function(){
                        $(this).dialog('destroy').remove();
                    }
                });
                window.scrollTo(0,0);
            }

        },

        ajaxSubmitter: function(elem,form){
            elem.before("<span class=\"button_green_start\"></span>")
                .after("<span class=\"button_green_end\"></span>")
                .bind('click',function(){$("form[name=" + form + "]").triggerHandler("submit")})
                .hover(
                    function () { $(this).addClass("show_pointer"); },
                    function () { $(this).removeClass("show_pointer"); }
                 );
        },

        formSubmitter: function(elem,form){
            elem.before("<span class=\"button_green_start\"></span>")
                .after("<span class=\"button_green_end\"></span>")
                .bind('click',function(){$("form[name=" + form + "]").trigger("submit")})
                .hover(
                    function () { $(this).addClass("show_pointer"); },
                    function () { $(this).removeClass("show_pointer"); }
                 );
        },

        resetForm: function(form){
            $(".error",form).css("display","none");
            $(".missed",form).removeClass("missed");
            $("#" + form.attr("name") + "_success").css("display","none");
            form.trigger("reset");
        }
    }
})();
/**
 * History/Remote - jQuery plugin for enabling history support and bookmarking
 * @requires jQuery v1.0.3
 *
 * http://stilbuero.de/jquery/history/
 *
 * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 * Version: 0.2.3
 */

(function($) { // block scope

/**
 * Initialize the history manager. Subsequent calls will not result in additional history state change
 * listeners. Should be called soonest when the DOM is ready, because in IE an iframe needs to be added
 * to the body to enable history support.
 *
 * @example $.ajaxHistory.initialize();
 *
 * @param Function callback A single function that will be executed in case there is no fragment
 *                          identifier in the URL, for example after navigating back to the initial
 *                          state. Use to restore such an initial application state.
 *                          Optional. If specified it will overwrite the default action of
 *                          emptying all containers that are used to load content into.
 * @type undefined
 *
 * @name $.ajaxHistory.initialize()
 * @cat Plugins/History
 * @author Klaus Hartl/klaus.hartl@stilbuero.de
 */
$.ajaxHistory = new function() {

    var RESET_EVENT = 'historyReset';

    var _currentHash = "";
    var _intervalId = null;
    var _observeHistory; // define outside if/else required by Opera

    this.update = function() { }; // empty function body for graceful degradation

    // create custom event for state reset
    var _defaultReset = function() {
        $('.remote-output').empty();
    };
    $(document).bind(RESET_EVENT, _defaultReset);

    // TODO fix for Safari 3
    // if ($.browser.msie)
    // else if hash != _currentHash
    // else check history length

    if ($.browser.msie) {

        var _historyIframe, initialized = false; // for IE

        // add hidden iframe
        $(function() {
            _historyIframe = $('<iframe style="display: none;"></iframe>').appendTo(document.body).get(0);
            var iframe = _historyIframe.contentWindow.document;
            // create initial history entry
            iframe.open();
            if (document.location.hash && document.location.hash != '#') {
                iframe.location.hash = document.location.hash.replace('#', '');
            }
            iframe.close();
        });

        this.update = function(hash) {
            try {
                var iframe = _historyIframe.contentWindow.document;
                if(hash != iframe.location.hash){
                    iframe.open();
                    iframe.close();
                    iframe.location.hash = hash.replace('#', '');
                    _currentHash = hash;
                }
            } catch(e) {}

        };

        _observeHistory = function() {
            var iframe = _historyIframe.contentWindow.document;
            var iframeHash = iframe.location.hash;
            if (iframeHash != _currentHash) {
                _currentHash = iframeHash;
                if (iframeHash && iframeHash != '#') {
                    // order does matter, set location.hash after triggering the click...
                    $('a[href$="' + iframeHash + '"]').click();
                    location.hash = iframeHash;
                } else if (initialized) {
                    location.hash = '';
                    $(document).trigger(RESET_EVENT);
                }
            }
            initialized = true;

        };

    } else if ($.browser.mozilla || $.browser.opera || $.browser.safari) {

        this.update = function(hash) {
            _currentHash = hash;
        };

        _observeHistory = function() {
            if (location.hash) {
                if (_currentHash != location.hash) {
                    _currentHash = location.hash;
                    $('a[href$="' + _currentHash + '"]').click();
                }
            } else if (_currentHash) {
                _currentHash = '';
                $(document).trigger(RESET_EVENT);
            }
        };

    } else if ($.browser.safari) {

        var _backStack, _forwardStack, _addHistory; // for Safari

        // etablish back/forward stacks
        $(function() {
            _backStack = [];
            _backStack.length = history.length;
            _forwardStack = [];

        });
        var isFirst = false, initialized = false;
        _addHistory = function(hash) {
            _backStack.push(hash);
            _forwardStack.length = 0; // clear forwardStack (true click occured)
            isFirst = false;
        };

        this.update = function(hash) {
            _currentHash = hash;
            _addHistory(_currentHash);
        };

        _observeHistory = function() {
            var historyDelta = history.length - _backStack.length;
            if (historyDelta) { // back or forward button has been pushed
                isFirst = false;
                if (historyDelta < 0) { // back button has been pushed
                    // move items to forward stack
                    for (var i = 0; i < Math.abs(historyDelta); i++) _forwardStack.unshift(_backStack.pop());
                } else { // forward button has been pushed
                    // move items to back stack
                    for (var i = 0; i < historyDelta; i++) _backStack.push(_forwardStack.shift());
                }
                var cachedHash = _backStack[_backStack.length - 1];
                $('a[href$="' + cachedHash + '"]').click();
                _currentHash = location.hash;
            } else if (_backStack[_backStack.length - 1] == undefined && !isFirst) {
                // back button has been pushed to beginning and URL already pointed to hash (e.g. a bookmark)
                // document.URL doesn't change in Safari
                if (document.URL.indexOf('#') >= 0) {
                    $('a[href$="' + '#' + document.URL.split('#')[1] + '"]').click();
                } else if (initialized) {
                    $(document).trigger(RESET_EVENT);
                }
                isFirst = true;
            }
            initialized = true;
        };

    }

    this.initialize = function(callback) {
        // custom callback to reset app state (no hash in url)
        if (typeof callback == 'function') {
            $(document).unbind(RESET_EVENT, _defaultReset).bind(RESET_EVENT, callback);
        }
        // look for hash in current URL (not Safari)
        if (location.hash && typeof _addHistory == 'undefined') {
            $('a[href$="' + location.hash + '"]').trigger('click');
        }
        // start observer
        if (_observeHistory && _intervalId == null) {
            _intervalId = setInterval(_observeHistory, 200); // Safari needs at least 200 ms
        }
    };

};

$.fn.remote = function(output, settings, callback) {

    callback = callback || function() {};
    if (typeof settings == 'function') { // shift arguments
        callback = settings;
    }

    settings = $.extend({
        hashPrefix: 'remote-'
    }, settings || {});

    var target = $(output).size() && $(output) || $('<div></div>').appendTo('body');
    target.addClass('remote-output');

    return this.each(function(i) {
        var href = this.href, hash = '#' + (this.title && this.title.replace(/\s/g, '_') || settings.hashPrefix + (i + 1)),
            a = this;
        this.href = hash;
        $(this).click(function(e) {
            // lock target to prevent double loading in Firefox
            if (!target['locked']) {
                // add to history only if true click occured, not a triggered click
                if (e.clientX) {
                    $.ajaxHistory.update(hash);
                }
                target.load(href, function() {
                    target['locked'] = null;
                    callback.apply(a);
                });
            }
        });
    });

};

$.fn.history = function(callback) {
    return this.click(function(e) {
    _actionFlag=1;
        // add to history only if true click occured, not a triggered click
        if (e.clientX) {
            $.ajaxHistory.update(this.hash);
        }
        // tty - pass event object to callback
        typeof callback == 'function' && callback(e);
    _actionFlag=0;
    });
};

})(jQuery);


CookieManager = (function(){
  var domain = new String();

  return {
    get: function( c_name ){
        if (document.cookie.length>0){
            var c_start=document.cookie.indexOf(c_name+"=");
            if (c_start!=-1){
                c_start=c_start + c_name.length+1;
                var c_end=document.cookie.indexOf(";",c_start);
                if (c_end==-1){
                    c_end=document.cookie.length;
                }
                return unescape(document.cookie.substring(c_start,c_end));
            }
        }
        return false;
    },

    set: function( c_name, val, days ){
      var domain_name = this.getDomain();
      days = days ? days : 3000;
      var exp = new Date();
      exp.setDate(exp.getDate() + days);
      document.cookie=c_name+"="+escape(val)+"; expires="+exp.toGMTString()+"; path=/; domain=." + domain_name + ";";
    },

    remove: function( c_name ){
      var domain_name = this.getDomain();
      var exp = new Date();
      if(CookieManager.get(c_name)){
          exp.setDate(exp.getDate()-3000); // expires 10 years ago
          document.cookie=c_name+"=; expires="+exp.toGMTString()+"; path=/; domain=." + domain_name + ";";
      }
    },

    getDomain: function(){
        return domain != "" ? domain : this.setDomain();
    },

    setDomain: function(val){
      if(!val){
        var domain_bits = document.domain.split(".");
        var bit_count = domain_bits.length - 1;
        domain = domain_bits[bit_count - 1] + "." + domain_bits[bit_count];
      }
      return domain;
    }
  }
})();
Validate = (function(){
  var email_pattern = /^[^\s()<>@,;:\/]+@\w[\w\.-]*\.[a-z]{2,}$/i;
  return {
    email: function(val){
      return email_pattern.test(val);
    }
  }
})();

/* Template class is from Prototype library */
/* It has been modified to function independently */


var Template = function(template, pattern){
    this.template = template;
    this.pattern = pattern || this.Pattern;
};
Template.prototype = {
  Pattern: /(^|.|\r|\n)(#\{(.*?)\})/,
  gsub: function(source, pattern, replacement) {
      var result = '', match;
      while (source.length > 0) {
        if (match = source.match(pattern)) {
          result += source.slice(0, match.index);
          result += replacement(match);
          source  = source.slice(match.index + match[0].length);
        } else {
          result += source, source = '';
        }
      }
      return result;
  },
  evaluate: function(object) {
      return this.gsub(this.template,this.pattern,function(match) {
        if (object == null) return '';
        var before = match[1] || '';
        if (before == '\\') return match[2];
        var ctx = object, expr = match[3];
        var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
        match = pattern.exec(expr);
        if (match == null) return before;
        while (match != null) {
          var comp = match[1].indexOf('[') === 0 ? match[2].gsub('\\\\]', ']') : match[1];
          ctx = ctx[comp];
          if (null == ctx || '' == match[3]) break;
          expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
          match = pattern.exec(expr);
        }
        if (typeof ctx == "undefined") ctx = "";
        return before + ctx;
      });
  }
};
/*! Copyright (c) 2009 Brandon Aaron (http://brandonaaron.net)
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
* Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
* Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
*
* Version: 3.0.2
*
* Requires: 1.2.2+
*/

(function($) {

var types = ['DOMMouseScroll', 'mousewheel'];

$.event.special.mousewheel = {
  setup: function() {
    if ( this.addEventListener )
      for ( var i=types.length; i; )
        this.addEventListener( types[--i], handler, false );
    else
      this.onmousewheel = handler;
  },

  teardown: function() {
    if ( this.removeEventListener )
      for ( var i=types.length; i; )
        this.removeEventListener( types[--i], handler, false );
    else
      this.onmousewheel = null;
  }
};

$.fn.extend({
  mousewheel: function(fn) {
    return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
  },

  unmousewheel: function(fn) {
    return this.unbind("mousewheel", fn);
  }
});


function handler(event) {
  var args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true;

  event = $.event.fix(event || window.event);
  event.type = "mousewheel";

  if ( event.wheelDelta ) delta = event.wheelDelta/120;
  if ( event.detail ) delta = -event.detail/3;

  // Add events and delta to the front of the arguments
  args.unshift(event, delta);

  return $.event.handle.apply(this, args);
}

})(jQuery);


var Scroller = (function(element_id,opt) {

    // START PRIVATE STATIC ATTRIBUTES
    var scroller_template = String("<div id='#{id}' style='height:#{scroller_height};top:#{scroller_top};'></div>");

    return function(element_id,opt){

      // START PRIVATE ATTRIBUTES
      var that = this; //reference to current object
      var vertical_scroller_width = 12;
      var scroll_handle_height = 12;
      var options = typeof opt != "undefined" ? opt : {};

      // START PRIVILEGED METHODS
      this.element = null;
      this.data = {};
      this.scope = options.hasOwnProperty("scope") ? options.scope : document;

      //removes the scroller elements
      this.remove = function(){
          var wrapper_div = $(this.data.wrapper_id,this.scope);
          wrapper_div.replaceWith($("div:first",wrapper_div).html());
          $("div[class*='ui-slider']",this.element).remove();
          this.element.removeClass("has_scroller").css({"overflow":"hidden","height":"","position":""});
      };

      //removes the scroller elements and deletes it from the list of known scrollers
      this.destroy = function(){
          this.remove();
          delete Scroller.scrollers[element_id];
      }

      this.reset = function(){
        if(this.data.has_scroller == false){
            that.setElementData();
            that.determineScrollingRequirements();
            that.create();
        }else{
            that.setElementData();
            var wrapper = $(this.data.wrapper_id,this.element);
            if(wrapper.length){
                try{
                  wrapper.width(this.data.width);
                  wrapper.height(this.data.height);
                  $("div.ui-slider-vertical-wrapper",this.element).height(this.data.height);
                  $("div.ui-slider-vertical-innerwrapper",this.element).height(this.data.height);
                  $("div.ui-slider-vertical",this.element).height(this.data.height);
                  var remove_vertical = (wrapper.get(0).scrollHeight - this.data.height) <= 0;
                  if(remove_vertical){
                      that.remove();
                  }
                }catch(e){}
            }
        }
      };

      this.setElement = function(){
        this.element = $("#" + element_id,this.scope);
        var scrollable_child = $("div.scroll_content_override",this.element);
        if(scrollable_child.length > 0){
            this.element = scrollable_child
        }
        this.setElementData();
      };

      this.setElementData = function(){
        var tmp_height = this.element.innerHeight();
        var tmp_max_height = options.hasOwnProperty("height")
            ? options.height
            : (this.element.offsetParent().innerHeight() - this.element.get(0).offsetTop);
        this.data = {
            has_scroller: this.element.hasClass("has_scroller"),
            height: tmp_height,
            offset: this.element.offset(),
            max_height: tmp_max_height,
            needs_y: false,
            parent_height: this.element.parent().innerHeight(),
            width: that.width(this.element),
            wrapper_id: "#wrapper_" + element_id,
            constrained_height: tmp_max_height
        };
      };

      this.prepareElement = function(orientation){
        var scroller_id = "scroller_" + orientation + "_" + element_id;
        var scroller_height = 0;
        var scroller_top = 0;

        if(orientation == "vertical"){
          scroller_height = this.data.max_height - (scroll_handle_height * 2);
          scroller_top = scroll_handle_height;
          if(this.data.has_scroller===false){
            this.element.wrapInner("<div id='wrapper_" + element_id + "' class='ui-slider-scroll-area' style='position:relative;height:"+this.data.max_height+"px;width:"+this.data.width+"px;overflow:hidden;'><div class='ui-slider-scroll-area-inner'></div></div>");
          }
        }

        this.element.css({"position":"relative","overflow":""}).addClass("has_scroller");

        // initialize, populate and append the scroller control template to the target
        var scroller_html = new Template(scroller_template);
        this.element.append(scroller_html.evaluate({
          'id':scroller_id,
          'orientation':orientation,
          'scroller_height':scroller_height + "px",
          'scroller_top': scroller_top + "px"
        }));
      };

      this.determineScrollingRequirements = function() {
        if(options.height && options.height < this.data.height){
          this.data.needs_y = true;
        }else if(this.data.height > this.data.max_height && this.element.css("position")!="absolute"){
          this.data.needs_y = true;
        }
      };

      this.createVerticalScroller = function(){
        var mouseup = false;
        var scroller_id = "#scroller_vertical_" + element_id;
        var that = this;
        $(this.data.wrapper_id,that.scope).attr("scrollTop",0);
        $(scroller_id,that.scope).slider({
          value: 100,
          orientation: "vertical",
          animate: false,
          change: function(e,ui){
            var height = that.height(that.element);
            var maxScroll = ($(that.data.wrapper_id,that.element).get(0).scrollHeight - height);
            $(that.data.wrapper_id,that.element).attr("scrollTop", (100-ui.value) * (maxScroll / 100));
          },
          slide: function(e,ui){
            var height = that.height(that.element);
            var maxScroll = ($(that.data.wrapper_id,that.element).get(0).scrollHeight - height);
            $(that.data.wrapper_id,that.element).attr("scrollTop",(100-ui.value) * (maxScroll / 100));
          }
        });

        $(that.data.wrapper_id,that.element).bind('mousewheel', function(event, delta) {
            vel = Math.abs(delta)*10;
            if(delta > 0){
                $(scroller_id,that.scope).slider("value", $(scroller_id,that.scope).slider("value")+vel);
            }else{
                $(scroller_id,that.scope).slider("value", $(scroller_id,that.scope).slider("value")-vel);
            }
            return false;
        });


      };

      this.create = function() {
        if(that.data.needs_y){
            this.prepareElement("vertical");
            this.createVerticalScroller();
            var scroller_name = options.hasOwnProperty("name") ? options.name : element_id;
            Scroller.scrollers[scroller_name]=this;
        }
     }
      // CONSTRUCTOR CODE
        if(typeof Scroller.scrollers[element_id]=="undefined"){
          this.setElement();
          this.determineScrollingRequirements();
          this.create();
        }else{
          Scroller.scrollers[element_id].reset();
        }
    }
})();

Scroller.scrollers = new Object();

Scroller.getScrollerIds = function(){
    var current_scrollers = Scroller.scrollers;
    return $.map(current_scrollers,function(n,i){
       return n;
    });
}

Scroller.destroyAll = function(){
    var scroller_length = Scroller.scrollers.length;
    for (var i in Scroller.scrollers){
      Scroller.scrollers[i].destroy();
    }
}

Scroller.destroy = function(name){
    if(Scroller.scrollers.hasOwnProperty(name)){
        Scroller.scrollers[name].destroy();
    }
}

Scroller.prototype = {
  height: function(element){
    return element.height() || parseInt(element.css('height'));
  },

  width: function(element){
    return element.width() || parseInt(element.css('width'));
  }
}

jQuery.url=function(){var segments={};var parsed={};var options={url:window.location,strictMode:false,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}};var parseUri=function(){str=decodeURI(options.url);var m=options.parser[options.strictMode?"strict":"loose"].exec(str);var uri={};var i=14;while(i--){uri[options.key[i]]=m[i]||""}uri[options.q.name]={};uri[options.key[12]].replace(options.q.parser,function($0,$1,$2){if($1){uri[options.q.name][$1]=$2}});return uri};var key=function(key){if(!parsed.length){setUp()}if(key=="base"){if(parsed.port!==null&&parsed.port!==""){return parsed.protocol+"://"+parsed.host+":"+parsed.port+"/"}else{return parsed.protocol+"://"+parsed.host+"/"}}return(parsed[key]==="")?null:parsed[key]};var param=function(item){if(!parsed.length){setUp()}return(parsed.queryKey[item]===null)?null:parsed.queryKey[item]};var setUp=function(){parsed=parseUri();getSegments()};var getSegments=function(){var p=parsed.path;segments=[];segments=parsed.path.length==1?{}:(p.charAt(p.length-1)=="/"?p.substring(1,p.length-1):path=p.substring(1)).split("/")};return{setMode:function(mode){strictMode=mode=="strict"?true:false;return this},setUrl:function(newUri){options.url=newUri===undefined?window.location:newUri;setUp();return this},segment:function(pos){if(!parsed.length){setUp()}if(pos===undefined){return segments.length}return(segments[pos]===""||segments[pos]===undefined)?null:segments[pos]},attr:key,param:param}}();


Console = (function(){
  return {
    log: function(message){
      if(window.console) {
        console.log(message);
      }else{
                $("#log").css("display","block");
                $("#log").append("<div>"+message+"</div>");
            }
    },
    warn: function(message){
      if(window.console) {
        console.warn(message);
      }
    },
    error: function(message){
      if(window.console) {
        console.error(message);
      }
    },
    debug: function(element){
      if(window.console) {
        console.debug(element);
      }
    },
    trace: function(element){
      if(window.console) {
        console.trace(element);
      }
    }
    }
})();
Array.prototype.intersect =
  function() {
    if (!arguments.length)
      return [];
    var a1 = this;
    var a = a2 = null;
    var n = 0;
    while(n < arguments.length) {
      a = [];
      a2 = arguments[n];
      var l = a1.length;
      var l2 = a2.length;
      for(var i=0; i<l; i++) {
        for(var j=0; j<l2; j++) {
          if (a1[i] === a2[j])
            a.push(a1[i]);
        }
      }
      a1 = a;
      n++;
    }
    return a.unique();
  };
Array.prototype.unique =
  function() {
    var a = [];
    var l = this.length;
    for(var i=0; i<l; i++) {
      for(var j=i+1; j<l; j++) {
        // If this[i] is found later in the array
        if (this[i] === this[j])
          j = ++i;
      }
      a.push(this[i]);
    }
    return a;
  };


/*
 * jQuery Event Delegation Plugin - jquery.eventdelegation.js
 * Fast flexible event handling
 *
 * January 2008 - Randy Morey (http://dev.distilldesign.com/)
 */

(function ($) {
  /* setup list of allowed events for event delegation
   * only events that bubble are appropriate
   */
  var allowed = {};
  $.each([
    'click',
    'dblclick',
    'mousedown',
    'mouseup',
    'mousemove',
    'mouseover',
    'mouseout',
    'keydown',
    'keypress',
    'keyup'
    ], function(i, eventName) {
      allowed[eventName] = true;
  });

  $.fn.extend({
    delegate: function (event, selector, f) {
      return $(this).each(function () {
        if (allowed[event])
          $(this).bind(event, function (e) {
            var el = $(e.target),
              result = false;

            while (!$(el).is('body')) {
              if ($(el).is(selector)) {
                result = f.apply($(el)[0], [e]);
                if (result === false)
                  e.preventDefault();
                return;
              }

              el = $(el).parent();
            }
          });
      });
    },
    undelegate: function (event) {
      return $(this).each(function () {
        $(this).unbind(event);
      });
    }
  });
})(jQuery);

/*!
 * jQuery corner plugin: simple corner rounding
 * Examples and documentation at: http://jquery.malsup.com/corner/
 * version 1.98 (02-JUN-2009)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 */

/**
 *  corner() takes a single string argument:  $('#myDiv').corner("effect corners width")
 *
 *  effect:  name of the effect to apply, such as round, bevel, notch, bite, etc (default is round).
 *  corners: one or more of: top, bottom, tr, tl, br, or bl.
 *           by default, all four corners are adorned.
 *  width:   width of the effect; in the case of rounded corners this is the radius.
 *           specify this value using the px suffix such as 10px (and yes, it must be pixels).
 *
 * @name corner
 * @type jQuery
 * @param String options Options which control the corner style
 * @cat Plugins/Corner
 * @return jQuery
 * @author Dave Methvin (http://methvin.com/jquery/jq-corner.html)
 * @author Mike Alsup   (http://jquery.malsup.com/corner/)
 */
;(function($) {

var expr = (function() {
  if (! $.browser.msie) return false;
    var div = document.createElement('div');
    try { div.style.setExpression('width','0+0'); }
    catch(e) { return false; }
    return true;
})();

function sz(el, p) {
    return parseInt($.css(el,p))||0;
};
function hex2(s) {
    var s = parseInt(s).toString(16);
    return ( s.length < 2 ) ? '0'+s : s;
};
function gpc(node) {
    for ( ; node && node.nodeName.toLowerCase() != 'html'; node = node.parentNode ) {
        var v = $.css(node,'backgroundColor');
        if (v == 'rgba(0, 0, 0, 0)')
            continue; // webkit
        if (v.indexOf('rgb') >= 0) {
            var rgb = v.match(/\d+/g);
            return '#'+ hex2(rgb[0]) + hex2(rgb[1]) + hex2(rgb[2]);
        }
        if ( v && v != 'transparent' )
            return v;
    }
    return '#ffffff';
};

function getWidth(fx, i, width) {
    switch(fx) {
    case 'round':  return Math.round(width*(1-Math.cos(Math.asin(i/width))));
    case 'cool':   return Math.round(width*(1+Math.cos(Math.asin(i/width))));
    case 'sharp':  return Math.round(width*(1-Math.cos(Math.acos(i/width))));
    case 'bite':   return Math.round(width*(Math.cos(Math.asin((width-i-1)/width))));
    case 'slide':  return Math.round(width*(Math.atan2(i,width/i)));
    case 'jut':    return Math.round(width*(Math.atan2(width,(width-i-1))));
    case 'curl':   return Math.round(width*(Math.atan(i)));
    case 'tear':   return Math.round(width*(Math.cos(i)));
    case 'wicked': return Math.round(width*(Math.tan(i)));
    case 'long':   return Math.round(width*(Math.sqrt(i)));
    case 'sculpt': return Math.round(width*(Math.log((width-i-1),width)));
    case 'dog':    return (i&1) ? (i+1) : width;
    case 'dog2':   return (i&2) ? (i+1) : width;
    case 'dog3':   return (i&3) ? (i+1) : width;
    case 'fray':   return (i%2)*width;
    case 'notch':  return width;
    case 'bevel':  return i+1;
    }
};

$.fn.corner = function(o) {
    // in 1.3+ we can fix mistakes with the ready state
  if (this.length == 0) {
        if (!$.isReady && this.selector) {
            var s = this.selector, c = this.context;
            $(function() {
                $(s,c).corner(o);
            });
        }
        return this;
  }

    o = (o||"").toLowerCase();
    var keep = /keep/.test(o);                       // keep borders?
    var cc = ((o.match(/cc:(#[0-9a-f]+)/)||[])[1]);  // corner color
    var sc = ((o.match(/sc:(#[0-9a-f]+)/)||[])[1]);  // strip color
    var width = parseInt((o.match(/(\d+)px/)||[])[1]) || 10; // corner width
    var re = /round|bevel|notch|bite|cool|sharp|slide|jut|curl|tear|fray|wicked|sculpt|long|dog3|dog2|dog/;
    var fx = ((o.match(re)||['round'])[0]);
    var edges = { T:0, B:1 };
    var opts = {
        TL:  /top|tl/.test(o),       TR:  /top|tr/.test(o),
        BL:  /bottom|bl/.test(o),    BR:  /bottom|br/.test(o)
    };
    if ( !opts.TL && !opts.TR && !opts.BL && !opts.BR )
        opts = { TL:1, TR:1, BL:1, BR:1 };
    var strip = document.createElement('div');
    strip.style.overflow = 'hidden';
    strip.style.height = '1px';
    strip.style.backgroundColor = sc || 'transparent';
    strip.style.borderStyle = 'solid';
    return this.each(function(index){
        var pad = {
            T: parseInt($.css(this,'paddingTop'))||0,     R: parseInt($.css(this,'paddingRight'))||0,
            B: parseInt($.css(this,'paddingBottom'))||0,  L: parseInt($.css(this,'paddingLeft'))||0
        };

        if (typeof this.style.zoom != undefined) this.style.zoom = 1; // force 'hasLayout' in IE
        if (!keep) this.style.border = 'none';
        strip.style.borderColor = cc || gpc(this.parentNode);
        var cssHeight = $.curCSS(this, 'height');

        for (var j in edges) {
            var bot = edges[j];
            // only add stips if needed
            if ((bot && (opts.BL || opts.BR)) || (!bot && (opts.TL || opts.TR))) {
                strip.style.borderStyle = 'none '+(opts[j+'R']?'solid':'none')+' none '+(opts[j+'L']?'solid':'none');
                var d = document.createElement('div');
                $(d).addClass('jquery-corner');
                var ds = d.style;

                bot ? this.appendChild(d) : this.insertBefore(d, this.firstChild);

                if (bot && cssHeight != 'auto') {
                    if ($.css(this,'position') == 'static')
                        this.style.position = 'relative';
                    ds.position = 'absolute';
                    ds.bottom = ds.left = ds.padding = ds.margin = '0';
                    if (expr)
                        ds.setExpression('width', 'this.parentNode.offsetWidth');
                    else
                        ds.width = '100%';
                }
                else if (!bot && $.browser.msie) {
                    if ($.css(this,'position') == 'static')
                        this.style.position = 'relative';
                    ds.position = 'absolute';
                    ds.top = ds.left = ds.right = ds.padding = ds.margin = '0';

                    // fix ie6 problem when blocked element has a border width
                    if (expr) {
                        var bw = sz(this,'borderLeftWidth') + sz(this,'borderRightWidth');
                        ds.setExpression('width', 'this.parentNode.offsetWidth - '+bw+'+ "px"');
                    }
                    else
                        ds.width = '100%';
                }
                else {
                    ds.margin = !bot ? '-'+pad.T+'px -'+pad.R+'px '+(pad.T-width)+'px -'+pad.L+'px' :
                                        (pad.B-width)+'px -'+pad.R+'px -'+pad.B+'px -'+pad.L+'px';
                }

                for (var i=0; i < width; i++) {
                    var w = Math.max(0,getWidth(fx,i, width));
                    var e = strip.cloneNode(false);
                    e.style.borderWidth = '0 '+(opts[j+'R']?w:0)+'px 0 '+(opts[j+'L']?w:0)+'px';
                    bot ? d.appendChild(e) : d.insertBefore(e, d.firstChild);
                }
            }
        }
    });
};

$.fn.uncorner = function() {
  $('div.jquery-corner', this).remove();
  return this;
};

})(jQuery);


(function($) {
    var defaults  = {
        "repeat": false,
        "autoplay": true
    };
    var slideshows = {};
    $.fn.slideshow = function(settings) {
        var opts = settings ? settings : {};
        var class_tag = 'slideshow';

        return this.each(function(index){
            var document_pages_length = 0;
            var element = $(this);
            var initialized = element.hasClass(class_tag);
            var offset = 10;
            var that = this;

            function shuffle_pages_down(gt_pages,start){
                if(gt_pages.length){
                  gt_pages.each(function(x){
                      var z = start - x;
                      $(this).css('z-index',z).find(".slide_cover").css("opacity",(5-(gt_pages.length-x))/10);
                  });
                }
            }

            function shuffle_pages_up(lt_pages,len){
                if(lt_pages.length){
                    var l = len || 0;
                    if(l > lt_pages.length){
                        var z = l - lt_pages.length;
                    }else{
                        var z = 1;
                    }
                    lt_pages.each(function(x){
                        $(this).css('z-index',z+2).find(".slide_cover").css("opacity",(5-(x+1))/10);
                        z = z + 1;
                    });
                }
            }

            function toggle_slideshow_controls(target){
                target.css("display","none").siblings().css("display","block");
            }

            that.pages = $("a.slide",element);
            that.slide_number = false;

            that.initialize_controls = function(){
                $("#slideshow_start",element).unbind('click.'+class_tag).bind('click.'+class_tag,function(){
                    that.start();
                    toggle_slideshow_controls($(this));
                    return false;
                });
                $("#slideshow_stop",element).unbind('click.'+class_tag).bind('click.'+class_tag,function(){
                    that.stop();
                    toggle_slideshow_controls($(this));
                    return false;
                });
            }

            that.init = function(){
                that.iterations = 0;
                that.pages.filter(":not(:last)").each(function(x){
                    $(this).addClass("covered").find(".slide_cover").css("opacity",(5-x)/10);
                });
                that.pages.bind('click.'+class_tag,that.handle_page_click);
                element.addClass(class_tag).data(class_tag);
                that.initialize_controls();
            };

            that.handle_page_click = function(){
                if($(this).is(".covered")){
                    var clicked_page = that.pages.index(this);
                    that.rotate(clicked_page);
                    that.stop();
                    return false;
                } else if (that.options.hasOwnProperty("slide_click_callback") && typeof that.options.slide_click_callback == "function"){
                    that.options.slide_click_callback.call($(this));
                    return false;
                }
            };

            that.start = function(start_next){
                if(start_next!==false){
                    that.rotate();
                }
                window.slideshowInterval = setInterval(function(){
                    that.rotate();
                },5000);
            };

            that.stop = function(){
                clearInterval(window.slideshowInterval);
            };

            that.rotate = function(slide_override){
                var pages_length = that.pages.length;
                var previous_slide = that.slide_number === false ? that.pages.length - 1 : that.slide_number + 1;

                $(that.pages[previous_slide]).addClass("covered");

                if(typeof slide_override != "undefined"){
                    that.slide_number = slide_override;
                }else if (that.slide_number === false){
                    that.slide_number = pages_length-2;
                }

                var active_page = that.pages[that.slide_number];
                var lt_pages = that.pages.slice(0,that.slide_number);
                var gt_pages = that.slide_number+1 == that.pages.length ? [] : that.pages.slice((that.slide_number+1));

                if(that.pages[that.slide_number+1]){
                    $(active_page).removeClass("covered").find(".slide_cover").css("opacity",0);
                    if(that.options.animate === true && typeof slide_override == "undefined"){
                        var temp_width = that.slide_number+1 == that.pages.length ? $(that.pages[that.slide_number]).width() : $(that.pages[that.slide_number+1]).width();
                        $(that.pages[that.slide_number+1])
                          .animate(
                              {width:offset+'px'},
                              500,
                              'easeInOutSine',
                              function(){
                                  var p = lt_pages.length > gt_pages.length ? lt_pages.length : gt_pages.length

                                  $(active_page).css('z-index',pages_length*2)
                                  $(this).css('width',temp_width+"px").addClass("covered");

                                  shuffle_pages_down(gt_pages,p);
                                  shuffle_pages_up(lt_pages,gt_pages.length);
                              }
                          ).css('width',temp_width+"px").width(temp_width);
                    }else{
                        var p = lt_pages.length > gt_pages.length ? lt_pages.length : gt_pages.length

                        $(active_page).css('z-index',pages_length*2)
                        $(this).addClass("covered");

                        shuffle_pages_down(gt_pages,p);
                        shuffle_pages_up(lt_pages,gt_pages.length);
                    }
                }else{
                    if(that.options.animate === true && typeof slide_override == "undefined"){
                        that.pages.fadeOut("fast",function(){
                            $(active_page).css('z-index',pages_length);
                            $(that.pages[that.slide_number+1]).width(temp_width);
                            shuffle_pages_up(that.pages);
                            that.pages.addClass("covered").filter(":last").removeClass("covered").end().fadeIn("slow");
                        });
                    }else{
                        $(active_page).css('z-index',pages_length);
                        $(that.pages[that.slide_number+1]).width(temp_width);
                        shuffle_pages_up(that.pages);
                        that.pages.addClass("covered").filter(":last").removeClass("covered");
                    }
                    if(that.options.repeat===true){
                        that.iterations++;
                    }else{
                        that.stop();
                        toggle_slideshow_controls($("#slideshow_stop",element));
                    }
                }
                $("div.page_title span").text($(active_page).attr('title'));
                that.slide_number = that.slide_number > 0
                        ? that.slide_number - 1
                        : (pages_length-1);
            };

            that.next = function(){
                rotate();
            };

            that.previous = function(){
                rotate((that.slide_number - 2));
            };

            /******************************************
            * constructor code
            ******************************************/

            if(initialized==false){
                that.options = $.extend({}, defaults, opts);
                that.init();
                if(that.options.autoplay===true){
                    that.start(false);
                }else{
                    toggle_slideshow_controls($("#slideshow_stop",element));
                }
                element.addClass(class_tag).data(class_tag,that);
            }else if(initialized && typeof that[opts] == "function"){
                that[opts].call(element.data(class_tag));
            }
        });

    }

})(jQuery);


(function($) {
    var defaults  = {
        inputType : "text",
        saveButton : true,
        validInputTypes: ["text","textarea"]
    };
    $.fn.editable = function(settings) {
        var opts = typeof settings == "object" ? settings : {};
        var class_tag = 'is_editable';
        var text_template = '<input type="text" value="#{value}" style="width:#{width};height:#{height}" />';
        var textarea_template = '<textarea style="width:#{width};height:#{height};">#{value}</textarea>';
        var save_button_template = '<input type="submit" value="save" />';
        var ENTER_KEY = "13";
        var TAB_KEY = "9";

        return this.each(function(index){
            // standard plugin vars
            var element = $(this);
            var initialized = element.hasClass(class_tag);
            var that = this;
            that.options = $.extend({}, defaults, opts);
            var input_type = "text";
            var content,
                input,
                elem_w,
                elem_h;

            that.do_blur = function(){
                if(that.options.saveButton!==false){
                    $(this).next("input").remove();
                }
                $(this).unbind().prev().css("display","block").end().remove();
                if(typeof that.options.afterBlur == "function"){
                    that.options.afterBlur.call(this,$(this).val());
                }
            }

            that.handle_blur = function(){
                var keep_going = true;
                if(typeof that.options.onBlur == "function"){
                    keep_going = that.options.onBlur.call(this,$(this).val());
                }
                if(keep_going!==false){
                    that.do_blur.call($(this));
                }
            };

            that.update_text = function(e){
                var key = e.which;
                if(input_type == "text" && key==ENTER_KEY || key==TAB_KEY){
                    $(this).trigger('blur');
                }
                element.text($(this).val());
            };

            that.do_textarea_click = function(){
                var template_html = textarea_template;
                elem_w = that.options.hasOwnProperty('width')
                    ? typeof that.options.width == "string"
                        ? that.options.width
                        : that.options.width+"px"
                    : element.width()+"px";
                elem_h = that.options.hasOwnProperty('height')
                    ? typeof that.options.height == "string"
                        ? that.options.height
                        : that.options.height+"px"
                    : element.height()+"px";
                template_html = template_html.replace("#{width}",elem_w).replace("#{height}",elem_h).replace("#{value}",element.text());
                if(that.options.saveButton!==false){
                    template_html += save_button_template;
                }
                element
                    .after(template_html)
                    .css("display","none")
                    .next()
                        .bind('keydown.'+class_tag,that.update_text)
                        .bind('blur.'+class_tag,that.handle_blur)
                        .trigger("focus");
            };

            that.textarea_click = function(){
                var keep_going = true;
                if(typeof that.options.onClick == "function"){
                    keep_going = that.options.onClick.call(that);
                }
                if(keep_going!==false){
                    that.do_textarea_click.call($(this));
                }
            };

            that.do_text_click = function(){
                var template_html = text_template;
                elem_w = that.options.hasOwnProperty('width')
                    ? typeof that.options.width == "string"
                        ? that.options.width
                        : that.options.width+"px"
                    : element.width()+"px";
                elem_h = that.options.hasOwnProperty('height')
                    ? typeof that.options.height == "string"
                        ? that.options.height
                        : that.options.height+"px"
                    : element.height()+"px";
                template_html = template_html.replace("#{width}",elem_w).replace("#{height}",elem_h).replace("#{value}",element.text());
                if(that.options.saveButton!==false){
                    template_html += save_button_template;
                }
                element
                    .after(template_html)
                    .css("display","none")
                    .next()
                        .bind('keydown.'+class_tag,that.update_text)
                        .bind('blur.'+class_tag,that.handle_blur)
                        .trigger("select");
            };

            that.text_click = function(){
                var keep_going = true;
                if(typeof that.options.onClick == "function"){
                    keep_going = that.options.onClick.call(that);
                }
                if(keep_going!==false){
                    that.do_text_click.call($(this));
                }
            };

            that.init = function(){
                content = element.text();
                if($.inArray(that.options.inputType,that.options.validInputTypes)){
                    input_type = that.options.inputType;
                }
                that.enable();
            };

            that.disable = function(){
                element.unbind();
            };

            that.enable = function(){
                element.unbind().bind('click.'+class_tag,that[input_type+'_click']);
            };

            /******************************************
            * constructor code
            ******************************************/

            if(initialized==false){
                that.options = $.extend({}, defaults, opts);
                that.init();
                element.addClass(class_tag).data(class_tag,that);
            }else if(initialized && typeof that[opts] == "function"){
                that[opts].call(element.data(class_tag));
            }
        });
    }

})(jQuery);


(function($) {
    var defaults  = {
        animation_speed: 750,
        animation_easing: 'easeInOutCubic'
    };
    $.fn.simpleScroll = function(settings) {
        var opts = settings ? settings : {};
        var class_tag = 'simpleScroll';

        return this.each(function(index){
            // standard plugin vars
            var element = $(this);
            var initialized = element.hasClass(class_tag);
            var that = this;

            // custom plugin vars
            var content = element.find("ul");

            that.get_content_height = function(){
                return content.height();
            };

            that.get_scroll_height = function(){
                return content.get(0).scrollHeight;
            };

            that.get_scroll_top = function(){
                return content.scrollTop();
            };

            that.update_links = function(){
                var can_next = that.can_scroll_next();
                var can_prev = that.can_scroll_prev();
                if(can_next===true || can_prev===true){
                    if(can_next){
                        $("a[rel='next']",element).css("display","inline-block");
                    }else{
                        $("a[rel='next']",element).css("display","none");
                    }
                    if(can_prev){
                        $("a[rel='prev']",element).css("display","inline-block");
                    }else{
                        $("a[rel='prev']",element).css("display","none");
                    }
                    $(".widget_controls",element).css("display","inline-block");
                }else{
                    $(".widget_controls",element).css("display","none");
                }
            };

            that.can_scroll_prev = function(){
                return that.get_scroll_top() > 0;
            };

            that.can_scroll_next = function(){
                return (that.get_scroll_height() - (that.get_scroll_top() + that.get_content_height())) > 0;
            };

            that.get_new_scroll_top = function(dir){
                if(dir == "next" && that.can_scroll_next()){
                    return that.get_scroll_top() + (that.get_content_height() + 5);
                }else if (dir == "prev" && that.can_scroll_prev()){
                    var new_top = that.get_scroll_top() - (that.get_content_height() + 5);
                    return new_top < 0 ? 0 : new_top;
                }
                return false;
            };

            that.scroll = function(direction){
                var new_scroll_top = that.get_new_scroll_top(direction);
                if(new_scroll_top !== false){
                    content.animate(
                        {scrollTop: new_scroll_top},
                        {
                            duration: that.options.animation_speed,
                            easing: that.options.animation_easing,
                            complete: function(){
                                that.update_links();
                                if(typeof that.options.animation_complete == "function"){
                                    that.options.animation_complete.call(that);
                                }
                            }
                        }
                    );
                }
            };

            that.init = function(){
                var controls = $(".widget_controls a",element);
                controls.unbind('click').bind('click',function(){
                    var direction = $(this).attr("rel") ? $(this).attr("rel") : "next";
                    that.scroll(direction);
                    return false;
                });
                that.update_links();
                element.addClass(class_tag).data(class_tag,that);
            };

            /******************************************
            * constructor code
            ******************************************/
            if(initialized===false){
                that.options = $.extend({}, defaults, opts);
                that.init();
            }else if(initialized && typeof that[opts] == "function"){
                that[opts].call(element.data(class_tag));
            }

        });
    }

})(jQuery);

(function($) {
    var defaults  = {
        top: 0,
        duration: 500,
        easing: "easeInOutCubic"
    };
    $.fn.smoothScroll = function(settings) {
        var opts = settings ? settings : {};
        var class_tag = 'smoothScroll';

        return this.each(function(index){
            // standard plugin vars
            var element = $(this);
            var that = this;
            that.options = $.extend({}, defaults, opts);

            element.animate(
                { scrollTop: that.options.top },
                {
                    easing: that.options.easing,
                    duration: that.options.duration,
                    complete: function(){
                        if(typeof that.options.complete == "function"){
                            that.options.complete.call(that);
                        }
                    }
                }
            );
        });
    }

})(jQuery);

(function($) {
    var defaults  = {
        "active" : true
    };
    $.fn.completable = function(settings) {
        var opts = settings ? settings : {};
        var args = Array.prototype.slice.call(arguments, 1);
        var class_tag = 'is_completable';
        var key_map = {
            "40": "select_next",
            "38": "select_prev"
        };
        var ENTER_KEY = "13";
        var TAB_KEY = "9";

        return this.each(function(settings){
            // standard plugin vars
            var element = $(this);
            var initialized = element.hasClass(class_tag);
            var that = this;
            var elem_w,
                elem_h,
                elem_pos;

            that.active = true;

            that.activate = function(){
                that.active = true;
            };

            that.deactivate = function(){
                that.active = false;
            };

            that.find_hits = function(needle){
                search_complete=false;
                that.hits = [];
                var pattern = new RegExp(needle,"i");
                for(var i=0;i<that.options.haystack.length;i++){
                    if(pattern.test(that.options.haystack[i])){
                        that.hits.push(that.options.haystack[i]);
                    }
                    if(i==that.options.haystack.length-1){
                        that.search_complete=true;
                    }
                }
            };

            that.toggle = function(){
                if(that.active===false) return;
                if(that.list.is(":visible")){
                    that.list.hide();
                }else{
                    that.show_all();
                }
            };

            that.show_all = function(){
                that.hits = that.options.haystack;
                that.show_hits();
            };

            that.set_haystack = function(haystack){
                that.options.haystack = haystack;
            }

            that.show_hits = function(){
                var items = "";
                for(var i=0;i<that.hits.length;i++){
                    items += "<li><a href=\"#\">"+that.hits[i]+"</a></li>";
                }
                if(items!=""){
                    that.list.show().html(items);
                }else{
                    that.list.hide().find(".selected").removeClass("selected");
                }
            };

            that.select_prev = function(e){
                var selected = $(".selected",that.list);
                if(selected.length){
                    selected.removeClass("selected").prev().addClass("selected");
                }else{
                    $("li:last",that.list).addClass("selected");
                }
            };

            that.select_next = function(e){
                var selected = $(".selected",that.list);
                if(selected.length){
                    selected.removeClass("selected").next().addClass("selected");
                }else{
                    $("li:first",that.list).addClass("selected");
                }
            };

            that.select_current = function(e){
                var selected = $(".selected",that.list);
                if(selected.length){
                    e.preventDefault();
                    e.stopPropagation();
                    element.val(selected.text());
                    that.list.hide().find(".selected").removeClass("selected");
                }
            };

            /*
             * 1) match against the data
             * 2) show hits
             * 3) attach selector events (to highlight options)
             */
            that.handle_keydown = function(e){
                if(that.active===false) return;
                var key = e.which;
                if(key==ENTER_KEY || key==TAB_KEY){
                    that.select_current(e);
                }
                if(key==ENTER_KEY && that.list.is(":hidden") && element.closest("form").length){
                    element.closest("form").trigger('submit');
                }
            };

            that.handle_keyup = function(e){
                if(that.active===false) return;
                var key = e.which;
                if(key_map.hasOwnProperty(key)){
                    that[key_map[key]](e);
                }else if(key!=ENTER_KEY && key!=TAB_KEY){
                    that.find_hits(element.val());
                    that.searching_interval = setInterval(function(){
                        if(that.search_complete===true){
                            clearInterval(that.searching_interval);
                            that.show_hits();
                        }
                    });
                }
            }

            that.handle_blur = function(){
                if(that.active===false) return;
                //hide the list - but allow for a little time for the click events to work
                setTimeout(function(){
                    that.list.hide().find(".selected").removeClass("selected");
                },500);
            };

            that.handle_match_click = function(e){
                var target = $(e.target);
                if(target.is('a')){
                    e.preventDefault();
                    element.val(target.text());
                    that.list.hide().find(".selected").removeClass("selected");
                }

            };
            /*
             * 1) find position/dimensions of element
             * 2) insert complete list after element
             */
            that.init = function(){
                element
                    .unbind()
                    .bind('keyup.'+class_tag,that.handle_keyup)
                    .bind('keydown.'+class_tag,that.handle_keydown)
                    .bind('blur.'+class_tag,that.handle_blur);

                elem_w = element.width() || parseInt(element.css("width"),10);
                elem_h = element.outerHeight(true) || parseInt(element.css("height"),10);
                elem_pos = element.position();
                element.after(document.createElement("ol"));
                that.list = element.next().addClass(class_tag).css({
                    top: elem_pos.top + elem_h,
                    left : elem_pos.left,
                    width: elem_w
                }).bind('click.'+class_tag,that.handle_match_click);
                that.active = that.options.active;
            }

            /******************************************
            * constructor code
            ******************************************/
            if(initialized==false){
                that.options = $.extend({}, defaults, opts);
                that.init();
                element.addClass(class_tag).data(class_tag,that);
            }else if(initialized && typeof that[opts] == "function"){
                that[opts].apply(element.data(class_tag),args);
            }
        });
    }

})(jQuery);


(function($) {
    var defaults  = {
        error_position : "static"
    };
    $.fn.slinky = function(settings) {
        var opts = settings ? settings : {};
        var class_tag = 'slinky';
        var validations = {
            email: {pattern:/^[^\s()<>@,;:\/]+@\w[\w\.-]*\.[a-z]{2,}$/i,message:"invalid email address ex: username@domain.com"},
            phone: {pattern:/^\([1-9]\d{2}\)\s?\d{3}\-\d{4}$/,message:"invalid phone #: ex: 555 555-1212"},
            numeric: {pattern:/(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/,message:"this value should contain only numbers"},
            zip: {pattern:/(^\d{5}$)|(^\d{5}-\d{4}$)|(^[A-Za-z]\d[A-Za-z]\s?\d[A-Za-z]\d$)/,message:"invalid postal code ex: 12345-1234"}
        }

        function is_unchecked_checkbox(element){
            if(element.is("input:checkbox") && element.is(":checked")===false){
                return true;
            }else{
                return false;
            }
        }

        function check_section(e,section,success_callback){
            var that = this;
            var section_id = section.attr("id");
            var button_id = $(e.target).attr("id");
            var target_form = $(e.target).parents("form:first");
            var target_form_id = target_form.attr("id");
            var required_fields = section.data('required');
            var validate_fields = section.data('validate');
            var required_check_complete = false;
            var validate_check_complete = false;
            var missed = [];
            var invalid = [];

            hide_section_errors(section);
            if(required_check_complete === false){
                if(required_fields.hasOwnProperty(target_form_id)){
                    var are_required = required_fields[target_form_id];
                    are_required.each(function(i){
                        if($(this).val()=="" && !$(this).is(":disabled") || is_unchecked_checkbox($(this))===true){
                            missed.push($(this));
                        }
                        if(i == required_fields[target_form_id].length - 1){
                            required_check_complete = true;
                        }
                    });
                }else{
                    required_check_complete = true;
                }
            }

            if(validate_check_complete === false){
                if(validate_fields.hasOwnProperty(target_form_id)){
                    var need_validation = validate_fields[target_form_id];
                    need_validation.each(function(i){
                        var vc = $(this).attr("class");
                        var validation_type = vc.replace(/(.*)(validate_)(\S+)(.*)/i,"$3");
                        if(validations.hasOwnProperty(validation_type)){
                            if(!validations[validation_type].pattern.test($(this).val()) && !$(this).is(":disabled")){
                                invalid.push($(this));
                            }
                        }else if (validation_type.indexOf("matches")!=-1){
                            var match_field_name = vc.replace(/(.*)(validate_matches#)(\S+)(.*)/i,"$3");
                            var match_field = $("#"+match_field_name,section);
                            if(match_field.length){
                                if(match_field.val() != $(this).val() || $(this).val()==""){
                                    invalid.push($(this));
                                }
                            }
                        }
                        if(i == validate_fields[target_form_id].length - 1){
                            validate_check_complete = true;
                        }
                    });
                }else{
                    validate_check_complete = true;
                }
            }

            section.data('missed',missed);
            section.data('invalid',invalid);
            var check_interval = setInterval(function(){
                if(required_check_complete === true && validate_check_complete === true){
                    clearInterval(check_interval);
                    section.data("step_callback_complete",true);
                    if(missed.length > 0 || invalid.length > 0){
                        show_section_errors(section,that.options.error_position);
                    }else if(that.options.stepCallbacks.hasOwnProperty(section_id)){
                        section.data('checked',true);
                        section.data("step_callback_status","incomplete");
                        section.data("step_callback_retval","pending");
                        that.options.stepCallbacks[section_id].call(section,button_id)
                    }else{
                        section.data('checked',true);
                    }

                    if(section.data("step_callback_status") == "incomplete"){
                        var callback_interval = setInterval(function(){
                            if(typeof section.data("step_callback_retval") == "boolean"){
                                clearInterval(callback_interval);
                                section.data("step_callback_status","complete");
                                if(section.data("step_callback_retval") === true){
                                    complete_section.call(that,section,success_callback);
                                }
                            }
                        },50);
                    }else if(section.data('checked')===true){
                        complete_section.call(that,section,success_callback);
                    }
                }
            },50);

        }

        function complete_section(section,success_callback){
            var that = this;
            section.data('complete',true);
            section.data('wrapper').addClass("slinky-section-complete");
            if(typeof success_callback == "function"){
                success_callback.call(that);
            }
        }

        function add_change_link(section){
            var read_only = section.is(".slinky-readonly");
            var header = section.data("header");
            var section_n = section.data("index");
            var existing_link = $(".change_section",section.data('wrapper')).length;
            if(!read_only && typeof header != "undefined" && section_n != "undefined" && existing_link == 0){
                header.append("<a id=\"change_section_"+section_n+"\" href=\"#\" title=\"change\" class=\"change_section\">change</a>");
            }
        }

        function check_section_callback(section){
            var section_id = $(section).attr("id");
            var that = this;
            if(typeof that.options.stepCallbacks[section_id] == "function"){
                return that.options.stepCallbacks[section_id].call(section)
            }
            return true;
        }

        function hide_section_errors(section){
            $('.missed',section).removeClass('missed');
            $(".dynamic-error",section).remove();
            $('.input-hint',section).removeClass("invisible");
            $(".custom-error",section).hide()
        }

        function show_section_errors(section){
            var missed = section.data('missed');
            var invalid = section.data('invalid');
            var show_messages = section.hasClass("slinky-hide-error-text") ? false : true;
            $.each(missed,function(){
                var label = $("label[for='"+$(this).attr("id")+"']");
                var customError = $("#"+$(this).attr("id")+"Error",section);
                if(show_messages){
                    if(customError.length){
                        customError.show();
                    }else{
                        var error_text = label.text().replace(/[^\w\s]/,"") + " is required";
                        var pos = $(this).position();
                        var width = $(this).outerWidth(true) + 2;
                        $(this).after("<div class=\"dynamic-error\" style=\"position:absolute;top:"+pos.top+"px;left:"+(pos.left+width)+"px\">"+ error_text +"</div>");
                    }
                }
                if($(this).is(":checkbox")==false){
                    $(this).addClass("missed");
                }
                label.addClass("missed");
                $(this).siblings('.input-hint').addClass("invisible");
            });
            $.each(invalid,function(){
                var vc = $(this).attr("class");
                var validation_type = vc.replace(/(.*)(validate_)(\S+)(.*)/i,"$3");
                var label = $("label[for='"+$(this).attr("id")+"']");
                var customError = $("#"+$(this).attr("id")+"Error",section);
                if(show_messages){
                    if(customError.length){
                        customError.show();
                    }else{
                        var error_text = validations[validation_type].message;
                        var pos = $(this).position();
                        var width = $(this).outerWidth(true) + 2;
                        $(this).after("<div class=\"dynamic-error\" style=\"position:absolute;top:"+pos.top+"px;left:"+(pos.left+width)+"px\">"+ error_text +"</div>");
                    }
                }
                if($(this).is(":checkbox")==false){
                    $(this).addClass("missed");
                }
                label.addClass("missed");
                $(this).siblings('.input-hint').addClass("invisible");
            });
        }

        function init_change_section_links(){
            var that = this;
            $("a.change_section").live('click.'+class_tag,function(){
                var section_n = parseInt($(this).attr("id").replace("change_section_",""));
                that.move_to(section_n,true);
                return false;
            });
        }

        function init_section(section,x){
            var that = this;
            var section_wrapper = section.parent();
            var section_header = $("h2",section_wrapper);

            section.data('checked',false);
            section.data('header',section_header);
            section.data('wrapper',section_wrapper);
            section.data('index',x);
            // this setTimeout is only here because there's a slow js function that runs for the country/state fields
            // that creates select boxes on the fly - call this too early and state doesn't get included
            setTimeout(function(){
                $.fn.slinky.setformfields(section, that);
            },1000);
            section_wrapper.addClass(class_tag+"-section-wrapper");

            //if not the last section
            if(x < that.sections.length-1){
                section_wrapper.append("<div class=\"cascades\">&nbsp;</div>");
            }

            $(".finish",section).unbind().bind('click.'+class_tag,function(e){
                that.finish(e,section);
            });
            $(".next",section).unbind().bind('click.'+class_tag,function(e){
                that.move_forward(e,section);
                return false;
            });
            $(".prev",section).unbind().bind('click.'+class_tag,function(e){
                that.move_backward(e,section,true);
                return false;
            });
        }

        return this.each(function(index){
            // standard plugin vars
            var element = $(this);
            var that = this;
            var initialized = element.hasClass(class_tag);
            that.options = $.extend({}, defaults, opts);

            that.sections = $(".slinky-section", that);
            that.active_section = 0;

            that.finish = function(e,section){
                check_section.call(that,e,section,that.options.finishCallback);
            };

            that.move_forward = function(e,section){
                if(section.data("checked") === true && that.active_section == that.sections.length - 1){
                    that.finish(e,section);
                }else{
                    check_section.call(that,e,section,function(){
                        if(that.active_section == that.sections.length - 1){
                            that.finish(e,section);
                        }else{
                            add_change_link(section);
                            that.move_to(that.active_section+1);
                        }
                    });
                }
            };

            that.move_backward = function(e,section,moving_backward){
                that.move_to(that.active_section-1);
            };

            that.move_to = function(i,moving_back){
                if(i >= 0 && i < that.sections.length){
                    var going_backwards = typeof moving_back != "undefined" && moving_back === true;
                    var new_section = $(that.sections[i]);
                    var new_section_id = new_section.attr("id");
                    $("."+class_tag+"-active").removeClass(class_tag+"-active");
                    $(that.sections).not(":eq("+i+")").slideUp(500);
                    setTimeout(function(){
                        if(going_backwards){
                            $(that.sections).filter(":gt("+(i-1)+")")().each(function(){
                                $(this).data("checked",false).data("complete",false);
                                $(this).data("wrapper").find("a.change_section").remove();
                            });
                            if(that.options.changeCallbacks.hasOwnProperty(new_section_id)){
                                that.options.changeCallbacks[new_section_id].call(new_section)
                            }
                        }
                        new_section.slideDown(500);
                        new_section.parent().addClass(class_tag+"-active");
                        that.active_section = i;
                        CookieManager.set(that.id+"_active_section",i);
                    },500);
                }
            };

            that.init = function(){
                if(typeof that.options.beforeCreate=="function" && that.options.beforeCreate.call(that) === false){
                    return;
                }
                //go through sections, find fields (required, validate, etc), find nav buttons and attach all applicable events
                var start_at_cookie = parseInt(CookieManager.get(that.id+"_active_section"),10);
                var start_at = start_at_cookie < that.sections.length ? start_at_cookie : 0;
                that.sections.each(function(i){
                    init_section.call(that,$(this),i);
                });
                for(i=0;i<=start_at;i++){
                    var tmp_section = that.sections[i];
                    var section_ok = check_section_callback.call(that,tmp_section);
                    if(section_ok && i < start_at){
                        add_change_link($(tmp_section));
                    }
                    if(section_ok === false){
                        start_at = i;
                        that.after_init(start_at);
                        break;
                    }else if(section_ok === true && i==start_at && i<that.sections.length-1){
                        start_at++;
                        that.after_init(start_at);
                        break;
                    }else if (i==start_at){
                        that.after_init(start_at);
                    }
                }
            };

            that.after_init = function(start_at){
                that.move_to(start_at);
                init_change_section_links.call(that);
                if(typeof that.options.afterCreate=="function"){
                    that.options.afterCreate.call(that);
                }
            };


            /******************************************
            * constructor code
            ******************************************/
            if(initialized==false){
                that.options = $.extend({}, defaults, opts);
                that.init();
                element.addClass(class_tag).data(class_tag,that);
            }else if(initialized && typeof that[opts] == "function"){
                that[opts].call(element.data(class_tag));
            }
        });
    }

    /**
     * Stores form fields in section.data, depending on whether or not they
     * have class name "required" or "validate".  This method is placed into
     * the jQuery function set because it must be called by external code
     * when the field style changes.
     * The init_section method will set context ("that"), but if it has
     * not been set when this method is first called, the method will just return.
     *
     * Sets section.data values for:
     *  required users must fill in these form fields
     *  validate these fields will be validated against
     *  thatformid store the context for external methods to use
     *
     * @param section the document section in which the form fields are contained
     * @param that pointer to the context in which the section is set
     */
    $.fn.slinky.setformfields = function(section, that) {
        that = that ? that : document.getElementById(section.data('thatformid'));
        if (!that) {
            return;
        }
        var section_forms = $("form",section);
        var required = {};
        var validate = {};
        if(section_forms.length){
            section_forms.each(function(){
                var form_id = $(that).attr("id");
                var required_form_fields = $(":input.required",$(that));
                var validate_form_fields = $(":input[class*='validate_']",$(that));
                if(required_form_fields.length){
                    required[form_id] = required_form_fields;
                }
                if(validate_form_fields.length){
                    validate[form_id] = validate_form_fields;
                }
            });
        } else {
            var parent_form = section.parents("form:first");
            var form_id = parent_form.attr("id");
            var required_form_fields = $(":input.required",section);
            var validate_form_fields = $(":input[class*='validate_']",section);
            if(required_form_fields.length){
                required[form_id] = required_form_fields;
            }
            if(validate_form_fields.length){
                validate[form_id] = validate_form_fields;
            }
        }
        section.data('required',required);
        section.data('validate',validate);
        section.data('thatformid',that.id);
    };



})(jQuery);

/*###############################
 *####   countryandstate.js  ####
 *###############################
 */
var countrylist=[{abbr:'AF',name:'Afghanistan'},{abbr:'AL',name:'Albania'},{abbr:'DZ',name:'Algeria'},{abbr:'AS',name:'American Samoa'},{abbr:'AD',name:'Andorra'},{abbr:'AO',name:'Angola'},{abbr:'AI',name:'Anguilla'},{abbr:'AQ',name:'Antarctica'},{abbr:'AG',name:'Antigua and Barbuda'},{abbr:'AR',name:'Argentina'},{abbr:'AM',name:'Armenia'},{abbr:'AW',name:'Aruba'},{abbr:'AU',name:'Australia',states:[{abbr:'AAT',name:'Australian Antarctic Territory'},{abbr:'ACT',name:'Australian Capital Territory'},{abbr:'NSW',name:'New South Wales'},{abbr:'NT',name:'Northern Territory'},{abbr:'QLD',name:'Queensland'},{abbr:'SA',name:'South Australia'},{abbr:'TAS',name:'Tasmania'},{abbr:'VIC',name:'Victoria'},{abbr:'WA',name:'Western Australia'}]},{abbr:'AT',name:'Austria'},{abbr:'AZ',name:'Azerbaijan'},{abbr:'AP',name:'Azores'},{abbr:'BS',name:'Bahamas'},{abbr:'BH',name:'Bahrain'},{abbr:'BD',name:'Bangladesh'},{abbr:'BB',name:'Barbados'},{abbr:'BY',name:'Belarus'},{abbr:'BE',name:'Belgium'},{abbr:'BZ',name:'Belize'},{abbr:'BJ',name:'Benin'},{abbr:'BM',name:'Bermuda'},{abbr:'BT',name:'Bhutan'},{abbr:'BO',name:'Bolivia'},{abbr:'BA',name:'Bosnia And Herzegowina'},{abbr:'XB',name:'Bosnia-Herzegovina'},{abbr:'BW',name:'Botswana'},{abbr:'BV',name:'Bouvet Island'},{abbr:'BR',name:'Brazil',states:[{abbr:'AC',name:'Acre'},{abbr:'AL',name:'Alagoas'},{abbr:'AP',name:'Amapa'},{abbr:'AM',name:'Amazonas'},{abbr:'BA',name:'Baia'},{abbr:'CE',name:'Ceara'},{abbr:'DF',name:'Distrito Federal'},{abbr:'ES',name:'Espirito Santo'},{abbr:'FN',name:'Fernando de Noronha'},{abbr:'GO',name:'Goias'},{abbr:'MA',name:'Maranhao'},{abbr:'MT',name:'Mato Grosso'},{abbr:'MS',name:'Mato Grosso do Sul'},{abbr:'MG',name:'Minas Gerais'},{abbr:'PA',name:'Para'},{abbr:'PB',name:'Paraiba'},{abbr:'PR',name:'Parana'},{abbr:'PE',name:'Pernambuco'},{abbr:'PI',name:'Piaui'},{abbr:'RJ',name:'Rio de Janeiro'},{abbr:'RN',name:'Rio Grande do Norte'},{abbr:'RO',name:'Rondonia'},{abbr:'RR',name:'Roraima'},{abbr:'RS',name:'Rio Grande do Sul'},{abbr:'SC',name:'Santa Catarina'},{abbr:'SP',name:'Sao Paulo'},{abbr:'SE',name:'Sergipe'},{abbr:'TO',name:'Tocatins'}]},{abbr:'IO',name:'British Indian Ocean Territory'},{abbr:'VG',name:'British Virgin Islands'},{abbr:'BN',name:'Brunei Darussalam'},{abbr:'BG',name:'Bulgaria'},{abbr:'BF',name:'Burkina Faso'},{abbr:'BI',name:'Burundi'},{abbr:'KH',name:'Cambodia'},{abbr:'CM',name:'Cameroon'},{abbr:'CA',name:'Canada',states:[{abbr:'AB',name:'Alberta'},{abbr:'BC',name:'British Columbia'},{abbr:'MB',name:'Manitoba'},{abbr:'NB',name:'New Brunswick'},{abbr:'NL',name:'Newfoundland and Labrador'},{abbr:'NT',name:'Northwest Territories'},{abbr:'NS',name:'Nova Scotia'},{abbr:'NU',name:'Nunavut'},{abbr:'ON',name:'Ontario'},{abbr:'PE',name:'Prince Edward Island'},{abbr:'QC',name:'Quebec'},{abbr:'SK',name:'Saskatchewan'},{abbr:'YT',name:'Yukon Territory'}]},{abbr:'CV',name:'Cape Verde'},{abbr:'KY',name:'Cayman Islands'},{abbr:'CF',name:'Central African Republic'},{abbr:'TD',name:'Chad'},{abbr:'CL',name:'Chile'},{abbr:'CN',name:'China'},{abbr:'CX',name:'Christmas Island'},{abbr:'CC',name:'Cocos (Keeling) Islands'},{abbr:'CO',name:'Colombia'},{abbr:'KM',name:'Comoros'},{abbr:'CG',name:'Congo'},{abbr:'CD',name:'Congo, The Democratic Republic O'},{abbr:'CK',name:'Cook Islands'},{abbr:'XE',name:'Corsica'},{abbr:'CR',name:'Costa Rica'},{abbr:'CI',name:'Cote d` Ivoire (Ivory Coast)'},{abbr:'HR',name:'Croatia'},{abbr:'CU',name:'Cuba'},{abbr:'CY',name:'Cyprus'},{abbr:'CZ',name:'Czech Republic'},{abbr:'DK',name:'Denmark'},{abbr:'DJ',name:'Djibouti'},{abbr:'DM',name:'Dominica'},{abbr:'DO',name:'Dominican Republic'},{abbr:'TP',name:'East Timor'},{abbr:'EC',name:'Ecuador'},{abbr:'EG',name:'Egypt'},{abbr:'SV',name:'El Salvador'},{abbr:'GQ',name:'Equatorial Guinea'},{abbr:'ER',name:'Eritrea'},{abbr:'EE',name:'Estonia'},{abbr:'ET',name:'Ethiopia'},{abbr:'FK',name:'Falkland Islands (Malvinas)'},{abbr:'FO',name:'Faroe Islands'},{abbr:'FJ',name:'Fiji'},{abbr:'FI',name:'Finland'},{abbr:'FR',name:'France (Includes Monaco)'},{abbr:'FX',name:'France, Metropolitan'},{abbr:'GF',name:'French Guiana'},{abbr:'PF',name:'French Polynesia'},{abbr:'TA',name:'French Polynesia (Tahiti)'},{abbr:'TF',name:'French Southern Territories'},{abbr:'GA',name:'Gabon'},{abbr:'GM',name:'Gambia'},{abbr:'GE',name:'Georgia'},{abbr:'DE',name:'Germany'},{abbr:'GH',name:'Ghana'},{abbr:'GI',name:'Gibraltar'},{abbr:'GR',name:'Greece'},{abbr:'GL',name:'Greenland'},{abbr:'GD',name:'Grenada'},{abbr:'GP',name:'Guadeloupe'},{abbr:'GU',name:'Guam'},{abbr:'GT',name:'Guatemala'},{abbr:'GN',name:'Guinea'},{abbr:'GW',name:'Guinea-Bissau'},{abbr:'GY',name:'Guyana'},{abbr:'HT',name:'Haiti'},{abbr:'HM',name:'Heard And Mc Donald Islands'},{abbr:'VA',name:'Holy See (Vatican City State)'},{abbr:'HN',name:'Honduras'},{abbr:'HK',name:'Hong Kong'},{abbr:'HU',name:'Hungary'},{abbr:'IS',name:'Iceland'},{abbr:'IN',name:'India'},{abbr:'ID',name:'Indonesia'},{abbr:'IR',name:'Iran'},{abbr:'IQ',name:'Iraq'},{abbr:'EI',name:'Ireland (Eire)',states:[{abbr:'CO ANTRIM',name:'County Antrim'},{abbr:'CO ARMAGH',name:'County Armagh'},{abbr:'CO CARLOW',name:'County Carlow'},{abbr:'CO CAVAN',name:'County Cavan'},{abbr:'CO CLARE',name:'County Clare'},{abbr:'CO CORK',name:'County Cork'},{abbr:'CO DONEGAL',name:'County Donegal'},{abbr:'CO DOWN',name:'County Down'},{abbr:'CO DUBLIN',name:'County Dublin'},{abbr:'CO FERMANAGH',name:'County Fermanagh'},{abbr:'CO GALWAY',name:'County Galway'},{abbr:'CO KERRY',name:'County Kerry'},{abbr:'CO KILDARE',name:'County Kildare'},{abbr:'CO KILKENNY',name:'County Kilkenny'},{abbr:'CO LAOIS',name:'County Laois'},{abbr:'CO LEITRIM',name:'County Leitrim'},{abbr:'CO LIMERICK',name:'County Limerick'},{abbr:'CO DERRY',name:'County Londonderry'},{abbr:'CO LONGFORD',name:'County Longford'},{abbr:'CO LOUTH',name:'County Louth'},{abbr:'CO MAYO',name:'County Mayo'},{abbr:'CO MEATH',name:'County Meath'},{abbr:'CO OFFALY',name:'County Offaly'},{abbr:'CO MONAGHAN',name:'County Monaghan'},{abbr:'CO ROSCOMMON',name:'County Roscommon'},{abbr:'CO SLIGO',name:'County Sligo'},{abbr:'CO TIPPERARY',name:'County Tipperary'},{abbr:'CO TYRONE',name:'County Tyrone'},{abbr:'CO WATERFORD',name:'County Waterford'},{abbr:'CO WESTMEATH',name:'County Westmeath'},{abbr:'CO WEXFORD',name:'County Wexford'},{abbr:'CO WICKLOW',name:'County Wicklow'}]},{abbr:'IL',name:'Israel'},{abbr:'IT',name:'Italy'},{abbr:'JM',name:'Jamaica'},{abbr:'JP',name:'Japan'},{abbr:'JO',name:'Jordan'},{abbr:'KZ',name:'Kazakhstan'},{abbr:'KE',name:'Kenya'},{abbr:'KI',name:'Kiribati'},{abbr:'KP',name:'Korea, Democratic People\'s Repub'},{abbr:'KW',name:'Kuwait'},{abbr:'KG',name:'Kyrgyzstan'},{abbr:'LA',name:'Laos'},{abbr:'LV',name:'Latvia'},{abbr:'LB',name:'Lebanon'},{abbr:'LS',name:'Lesotho'},{abbr:'LR',name:'Liberia'},{abbr:'LY',name:'Libya'},{abbr:'LI',name:'Liechtenstein'},{abbr:'LT',name:'Lithuania'},{abbr:'LU',name:'Luxembourg'},{abbr:'MO',name:'Macao'},{abbr:'MK',name:'Macedonia'},{abbr:'MG',name:'Madagascar'},{abbr:'ME',name:'Madeira Islands'},{abbr:'MW',name:'Malawi'},{abbr:'MY',name:'Malaysia'},{abbr:'MV',name:'Maldives'},{abbr:'ML',name:'Mali'},{abbr:'MT',name:'Malta'},{abbr:'MH',name:'Marshall Islands'},{abbr:'MQ',name:'Martinique'},{abbr:'MR',name:'Mauritania'},{abbr:'MU',name:'Mauritius'},{abbr:'YT',name:'Mayotte'},{abbr:'MX',name:'Mexico'},{abbr:'FM',name:'Micronesia, Federated States Of'},{abbr:'MD',name:'Moldova, Republic Of'},{abbr:'MC',name:'Monaco'},{abbr:'MN',name:'Mongolia'},{abbr:'MS',name:'Montserrat'},{abbr:'MA',name:'Morocco'},{abbr:'MZ',name:'Mozambique'},{abbr:'MM',name:'Myanmar (Burma)'},{abbr:'NA',name:'Namibia'},{abbr:'NR',name:'Nauru'},{abbr:'NP',name:'Nepal'},{abbr:'NL',name:'Netherlands',states:[{abbr:'DR',name:'Drente'},{abbr:'FL',name:'Flevoland'},{abbr:'FR',name:'Friesland'},{abbr:'GL',name:'Gelderland'},{abbr:'GR',name:'Groningen'},{abbr:'LB',name:'Limburg'},{abbr:'NB',name:'Noord Brabant'},{abbr:'NH',name:'Noord Holland'},{abbr:'OV',name:'Overijssel'},{abbr:'UT',name:'Utrecht'},{abbr:'ZH',name:'Zuid Holland'},{abbr:'ZL',name:'Zeeland'}]},{abbr:'AN',name:'Netherlands Antilles'},{abbr:'NC',name:'New Caledonia'},{abbr:'NZ',name:'New Zealand'},{abbr:'NI',name:'Nicaragua'},{abbr:'NE',name:'Niger'},{abbr:'NG',name:'Nigeria'},{abbr:'NU',name:'Niue'},{abbr:'NF',name:'Norfolk Island'},{abbr:'MP',name:'Northern Mariana Islands'},{abbr:'NO',name:'Norway'},{abbr:'OM',name:'Oman'},{abbr:'PK',name:'Pakistan'},{abbr:'PW',name:'Palau'},{abbr:'PS',name:'Palestinian Territory, Occupied'},{abbr:'PA',name:'Panama'},{abbr:'PG',name:'Papua New Guinea'},{abbr:'PY',name:'Paraguay'},{abbr:'PE',name:'Peru'},{abbr:'PH',name:'Philippines'},{abbr:'PN',name:'Pitcairn'},{abbr:'PL',name:'Poland'},{abbr:'PT',name:'Portugal'},{abbr:'PR',name:'Puerto Rico'},{abbr:'QA',name:'Qatar'},{abbr:'RE',name:'Reunion'},{abbr:'RO',name:'Romania'},{abbr:'RU',name:'Russian Federation'},{abbr:'RW',name:'Rwanda'},{abbr:'KN',name:'Saint Kitts And Nevis'},{abbr:'SM',name:'San Marino'},{abbr:'ST',name:'Sao Tome and Principe'},{abbr:'SA',name:'Saudi Arabia'},{abbr:'SN',name:'Senegal'},{abbr:'XS',name:'Serbia-Montenegro'},{abbr:'SC',name:'Seychelles'},{abbr:'SL',name:'Sierra Leone'},{abbr:'SG',name:'Singapore'},{abbr:'SK',name:'Slovak Republic'},{abbr:'SI',name:'Slovenia'},{abbr:'SB',name:'Solomon Islands'},{abbr:'SO',name:'Somalia'},{abbr:'ZA',name:'South Africa'},{abbr:'GS',name:'South Georgia And The South Sand'},{abbr:'KR',name:'South Korea'},{abbr:'ES',name:'Spain'},{abbr:'LK',name:'Sri Lanka'},{abbr:'NV',name:'St. Christopher and Nevis'},{abbr:'SH',name:'St. Helena'},{abbr:'LC',name:'St. Lucia'},{abbr:'PM',name:'St. Pierre and Miquelon'},{abbr:'VC',name:'St. Vincent and the Grenadines'},{abbr:'SD',name:'Sudan'},{abbr:'SR',name:'Suriname'},{abbr:'SJ',name:'Svalbard And Jan Mayen Islands'},{abbr:'SZ',name:'Swaziland'},{abbr:'SE',name:'Sweden'},{abbr:'CH',name:'Switzerland'},{abbr:'SY',name:'Syrian Arab Republic'},{abbr:'TW',name:'Taiwan'},{abbr:'TJ',name:'Tajikistan'},{abbr:'TZ',name:'Tanzania'},{abbr:'TH',name:'Thailand'},{abbr:'TG',name:'Togo'},{abbr:'TK',name:'Tokelau'},{abbr:'TO',name:'Tonga'},{abbr:'TT',name:'Trinidad and Tobago'},{abbr:'XU',name:'Tristan da Cunha'},{abbr:'TN',name:'Tunisia'},{abbr:'TR',name:'Turkey'},{abbr:'TM',name:'Turkmenistan'},{abbr:'TC',name:'Turks and Caicos Islands'},{abbr:'TV',name:'Tuvalu'},{abbr:'UG',name:'Uganda'},{abbr:'UA',name:'Ukraine'},{abbr:'AE',name:'United Arab Emirates'},{abbr:'UK',name:'United Kingdom',states:[{abbr:'AVON',name:'Avon'},{abbr:'BEDS',name:'Bedfordshire'},{abbr:'BERKS',name:'Berkshire'},{abbr:'BUCKS',name:'Buckinghamshire'},{abbr:'CAMBS',name:'Cambridgeshire'},{abbr:'CHESH',name:'Cheshire'},{abbr:'CLEVE',name:'Cleveland'},{abbr:'CORN',name:'Cornwall'},{abbr:'CUMB',name:'Cumbria'},{abbr:'DERBY',name:'Derbyshire'},{abbr:'DEVON',name:'Devon'},{abbr:'DORSET',name:'Dorset'},{abbr:'DURHAM',name:'Durham'},{abbr:'ESSEX',name:'Essex'},{abbr:'GLOUS',name:'Gloucestershire'},{abbr:'GLONDON',name:'Greater London'},{abbr:'GMANCH',name:'Greater Manchester'},{abbr:'HANTS',name:'Hampshire'},{abbr:'HERWOR',name:'Hereford & Worcestershire'},{abbr:'HERTS',name:'Hertfordshire'},{abbr:'HUMBER',name:'Humberside'},{abbr:'IOM',name:'Isle of Man'},{abbr:'IOW',name:'Isle of Wight'},{abbr:'KENT',name:'Kent'},{abbr:'LANCS',name:'Lancashire'},{abbr:'LEICS',name:'Leicestershire'},{abbr:'LINCS',name:'Lincolnshire'},{abbr:'MERSEY',name:'Merseyside'},{abbr:'NORF',name:'Norfolk'},{abbr:'NHANTS',name:'Northamptonshire'},{abbr:'NTHUMB',name:'Northumberland'},{abbr:'NOTTS',name:'Nottinghamshire'},{abbr:'OXON',name:'Oxfordshire'},{abbr:'SHROPS',name:'Shropshire'},{abbr:'SOM',name:'Somerset'},{abbr:'STAFFS',name:'Staffordshire'},{abbr:'SUFF',name:'Suffolk'},{abbr:'SURREY',name:'Surrey'},{abbr:'SUSS',name:'Sussex'},{abbr:'WARKS',name:'Warwickshire'},{abbr:'WMID',name:'West Midlands'},{abbr:'WILTS',name:'Wiltshire'},{abbr:'YORK',name:'Yorkshire'}]},{abbr:'US',name:'United States',states:[{abbr:'AK',name:'Alaska'},{abbr:'AL',name:'Alabama'},{abbr:'AS',name:'American Samoa'},{abbr:'AR',name:'Arkansas'},{abbr:'AZ',name:'Arizona'},{abbr:'CA',name:'California'},{abbr:'CO',name:'Colorado'},{abbr:'CT',name:'Connecticut'},{abbr:'DC',name:'D.C.'},{abbr:'DE',name:'Delaware'},{abbr:'FL',name:'Florida'},{abbr:'GA',name:'Georgia'},{abbr:'GU',name:'Guam'},{abbr:'HI',name:'Hawaii'},{abbr:'ID',name:'Idaho'},{abbr:'IL',name:'Illinois'},{abbr:'IA',name:'Iowa'},{abbr:'IN',name:'Indiana'},{abbr:'KS',name:'Kansas'},{abbr:'KY',name:'Kentucky'},{abbr:'LA',name:'Louisiana'},{abbr:'ME',name:'Maine'},{abbr:'MP',name:'Marianas'},{abbr:'MD',name:'Maryland'},{abbr:'MH',name:'Marshall Islands'},{abbr:'MA',name:'Massachusetts'},{abbr:'MI',name:'Michigan'},{abbr:'FM',name:'Micronesia'},{abbr:'AA',name:'Military Americas'},{abbr:'AE',name:'Military Europe/ME/Canada'},{abbr:'AP',name:'Military Pacific'},{abbr:'MN',name:'Minnesota'},{abbr:'MS',name:'Mississippi'},{abbr:'MO',name:'Missouri'},{abbr:'MT',name:'Montana'},{abbr:'NE',name:'Nebraska'},{abbr:'NV',name:'Nevada'},{abbr:'NH',name:'New Hampshire'},{abbr:'NJ',name:'New Jersey'},{abbr:'NM',name:'New Mexico'},{abbr:'NY',name:'New York'},{abbr:'NC',name:'North Carolina'},{abbr:'ND',name:'North Dakota'},{abbr:'OH',name:'Ohio'},{abbr:'OK',name:'Oklahoma'},{abbr:'OR',name:'Oregon'},{abbr:'PW',name:'Palau'},{abbr:'PA',name:'Pennsylvania'},{abbr:'PR',name:'Puerto Rico'},{abbr:'RI',name:'Rhode Island'},{abbr:'SC',name:'South Carolina'},{abbr:'SD',name:'South Dakota'},{abbr:'TN',name:'Tennessee'},{abbr:'TX',name:'Texas'},{abbr:'UT',name:'Utah'},{abbr:'VT',name:'Vermont'},{abbr:'VI',name:'Virgin Islands'},{abbr:'VA',name:'Virginia'},{abbr:'WA',name:'Washington'},{abbr:'WV',name:'West Virginia'},{abbr:'WI',name:'Wisconsin'},{abbr:'WY',name:'Wyoming'}]},{abbr:'UM',name:'United States Minor Outlying Islands'},{abbr:'UY',name:'Uruguay'},{abbr:'UZ',name:'Uzbekistan'},{abbr:'VU',name:'Vanuatu'},{abbr:'XV',name:'Vatican City'},{abbr:'VE',name:'Venezuela'},{abbr:'VN',name:'Vietnam'},{abbr:'VI',name:'Virgin Islands (U.S.)'},{abbr:'WF',name:'Wallis and Furuna Islands'},{abbr:'EH',name:'Western Sahara'},{abbr:'WS',name:'Western Samoa'},{abbr:'YE',name:'Yemen'},{abbr:'YU',name:'Yugoslavia'},{abbr:'ZR',name:'Zaire'},{abbr:'ZM',name:'Zambia'},{abbr:'ZW',name:'Zimbabwe'}];

function initcountries(country_id, state_id, classtag) {
    var csel = $('select#' + country_id);

    for (i=0; i<countrylist.length; ++i) {
        $("<option>" + countrylist[i].name + "</option>")
            .attr("value", countrylist[i].abbr)
            .appendTo(csel);
    }

    setTimeout(function(){ initcountryselected(country_id, state_id, classtag) }, 1);
    csel.bind("change", function(){ updatestateinput(country_id, state_id, classtag) });
}

function initcountryselected(country_id, state_id, classtag) {
    var csel = $('select#' + country_id);
    var val = $('#' + country_id + "val").attr('value') || 'US';
    csel.children("[value=" + val + "]").attr("selected", "on");
    if(classtag){
        csel.addClass(classtag);
    }
    if (state_id && $("#" + state_id).length ) updatestateinput(country_id, state_id, classtag);
}

function updatestateinput(country_id, state_id, classtag) {
    var csel = $('select#' + country_id);
    var opt = csel.children(":selected").attr('value') || "";
    var form_section = $(csel.parents()[2]);

    for (i=0; i<countrylist.length; ++i) {
        if (countrylist[i].abbr == opt) {
            var newssel;
            var val = $('#' + state_id + "val").attr('value');
            var is_new = false;

            if (countrylist[i].states) {
                if($("#"+state_id).length && $("#"+state_id).is("select")){
                    newssel = $("#"+state_id);
                    newssel.children().remove();
                }else{
                    is_new = true;
                    newssel = $("<select></select>");
                }
                var newssel_options = ["<option value=''>-- Select one --</option>"];
                for (j=0; j<countrylist[i].states.length; ++j) {
                    var tmp_opt = "<option value='" + countrylist[i].states[j].abbr + "'>"+ countrylist[i].states[j].name +"</option>"
                    newssel_options.push(tmp_opt);
                }
                newssel.append(newssel_options.join());

                if (val) {
                    newssel.children("[value=" + val + "]").attr("selected", "on");
                    $('#' + state_id + "val").attr('value', "");
                } else {
                    newssel.children(":first").attr("selected", "on");
                }
            } else {
                is_new = true;
                newssel = $('<input type="text">');
                if (val) {
                    newssel.attr("value", val);
                    $('#' + state_id + "val").attr('value', "");
                }
            }

            newssel.attr({
                className : $('#' + state_id).attr("class"),
                name : $('#' + state_id).attr("name")
            });

            if(is_new === true){
                newssel.replaceAll('#' + state_id);
                //setformfields(form_section);
                $.fn.slinky.setformfields(form_section);
            }

            if(classtag){
                newssel.addClass(classtag);
            }
            $(newssel).attr("id", state_id); // Last to prevent duplicate id wackiness

            break;
        }
    }
}


Coverleaf.ReportingManager = (function(){
    var trackers = new Array();
    var camp_vars = ["source","campaign","medium","placement","creative","offer","campaign_id"];
    var that = {};
    return {
        getCampVars : function(){
            return camp_vars;
        },

        notifyEvent : function(eventName){
            for(var i in trackers){
                if(trackers.hasOwnProperty(i)){
                    trackers[i].trackEvent(eventName);
                }
            }
        },

        notifyPage : function(pageName){
            for(var i in trackers){
                if(trackers.hasOwnProperty(i)){
                    trackers[i].trackPage(pageName);
                }
            }
        },

        notifyAddItem : function(item, sku, name, category, price, quantity){
            for(var i in trackers){
                if(trackers.hasOwnProperty(i) && typeof trackers[i].addItem == "function"){
                    trackers[i].addItem(item, sku, name, category, price, quantity);
                }
            }
        },

        notifyAddTrans : function(orderId, affiliation, total , tax, shipping, city, state, country){
            for(var i in trackers){
                if(trackers.hasOwnProperty(i) && typeof trackers[i].addTrans == "function"){
                    trackers[i].addTrans(orderId, affiliation, total , tax, shipping, city, state, country);
                }
            }
        },

        notifyTrackTrans : function(){
            for(var i in trackers){
                if(trackers.hasOwnProperty(i) && typeof trackers[i].trackTrans == "function"){
                    trackers[i].trackTrans();
                }
            }
        },

        trackEvent : function(eventName){
            eventName = typeof eventName != "object" ? eventName : $(that).attr("trackpage");
            eventName = unescape(eventName);
            that.notifyEvent((eventName.replace(/[\s]+/g,"_").replace(/[^a-zA-Z0-9\/_]+/gi,"").toLowerCase()));
        },

        trackPage : function(pageName){
            if(typeof pageName == "object" && pageName != null){
                pageName = $(this).attr("trackpage");
            }else if(pageName == null){
                pageName = that.setPageNameToCurrentUrl();
            }
            pageName = unescape(pageName);
            that.notifyPage(pageName.replace(/[\s]+/g,"_").replace(/[^a-zA-Z0-9\/_]+/gi,"").toLowerCase());
        },

        addItem : function(item, sku, name, category, price, quantity){
            that.notifyAddItem(item, sku, name, category, price, quantity);
        },

        addTrans : function(orderId, affiliation, total , tax, shipping, city, state, country){
            that.notifyAddTrans(orderId, affiliation, total , tax, shipping, city, state, country);
        },

        trackTrans : function(){
            that.notifyTrackTrans();
        },

        addTracker : function(tracker){
            if(trackers.hasOwnProperty(tracker)===false){
                trackers.push(tracker);
            }
        },

        setTrackingCookies : function(){
            for ( var i=0;i<camp_vars.length;i++ ) {
                var current_var_value = (Coverleaf.getVariable(camp_vars[i])) ? Coverleaf.getVariable(camp_vars[i]) : null
                if(current_var_value){
                    CookieManager.set(camp_vars[i],current_var_value)
                }
            }
        },

        setPageNameToCurrentUrl : function(){
            var hash = location.hash
            var hostname = location.hostname;
            var path = location.pathname;
            var portal_test = /^www/;
            var store_test = /softslate/;
            /*check list: 1) is there a # and are we on the portal 2) are we on the store 3) return null because we're only tracking the www. and store*/
            if(hash && !store_test.test(location.pathname)){
              var track_hash = hash.indexOf("&") != -1 ? hash.substring(1,hash.indexOf("&")) : hash.substring(1);
              return (location.pathname.length > 0 && location.pathname != "/") ? location.pathname + "/" + track_hash : track_hash;
            }else if (store_test.test(location.pathname)){
                // /softslate/do/manufacturer/familycircle/
                var pretty_path = location.pathname.replace(/\/softslate?/gi,"").replace(/(\.?\/?do)/gi,"");
                return pretty_path;
            }else{
                return null;
            }
        },

        init : function(){
            that = Coverleaf.ReportingManager;
            that.setTrackingCookies();
            $("*[trackpage]").live('click',this.trackPage);

            if(typeof(analytics_uid) != 'undefined'){
                that.addTracker(new GoogleTracker(analytics_uid));
            }
            if(typeof(txt_tracking_server) != 'undefined'){
                that.addTracker(new TexterityTracker(camp_vars));
            }
        }
    }
})();

var GoogleTracker = function(tracker_id){
    var analytics_key = tracker_id ? tracker_id : false;
    var page_tracker;
    if(analytics_key!==false){
        //go = true;
        var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
        $.getScript(gaJsHost + "google-analytics.com/ga.js",function(){
            //page_tracker = (_gat ? _gat._getTracker(analytics_key) : null);
            var myinterval = setInterval(function(){
                page_tracker = (_gat ? _gat._getTracker(analytics_key) : null);
                if (page_tracker) {
                    clearInterval(myinterval);
                    page_tracker._setDomainName("." + CookieManager.getDomain());
                    if(CookieManager.get("source")){
                        page_tracker._setCampSourceKey("source");
                    }
                    if(CookieManager.get("campaign_id")){
                        page_tracker._setCampNameKey("campaign_id");
                    }
                    if(CookieManager.get("medium")){
                        page_tracker._setCampMediumKey("medium");
                    }
                    if(CookieManager.get("offer")){
                        page_tracker._setCampContentKey("offer");
                    }
                    if(CookieManager.get("placement")){
                        page_tracker._setCampTermKey("placement");
                    }
                    if(CookieManager.get("creative")){
                        page_tracker._setVar(CookieManager.get("creative"));
                    }
                }
            }, 10);
        });
    }

    this.trackEvent = function(eventName){
        var event_params = eventName.split("/");
        var event_category = event_params[0] ? escape(event_params[0]) : "";
        var event_action = event_params[1] ? escape(event_params[1]) : "";
        var event_label = event_params[2] ? escape(event_params[2]) : "";
        var interval = setInterval(function(){
            if (analytics_key===false) clearInterval(interval);
            if (page_tracker) {
                clearInterval(interval);
                page_tracker._trackEvent(event_category,event_action,event_label);
            }
        }, 10);
    }

    this.trackPage = function(pageName){
        var interval = setInterval(function(){
            if (analytics_key===false) clearInterval(interval);
            if (page_tracker) {
                clearInterval(interval);
                page_tracker._trackPageview(pageName);
            }
        }, 10);
    }

    this.addItem = function(item, sku, name, category, price, quantity){
        var interval = setInterval(function(){
            if (analytics_key===false) clearInterval(interval);
            if (page_tracker) {
                clearInterval(interval);
                page_tracker._addItem(item, sku, name, category, price, quantity);
            }
        }, 10);
    }

    this.addTrans = function(orderId, affiliation, total , tax, shipping, city, state, country){
        var interval = setInterval(function(){
            if (analytics_key===false) clearInterval(interval);
            if (page_tracker) {
                clearInterval(interval);
                page_tracker._addTrans(orderId, affiliation, total , tax, shipping, city, state, country);
            }
        }, 10);
    }

    this.trackTrans = function(){
        var interval = setInterval(function(){
        if (analytics_key===false) clearInterval(interval);
            if (page_tracker) {
                clearInterval(interval);
                page_tracker._trackTrans();
            }
        }, 10);
    }

};

var TexterityTracker = function(camp_vars){
    var event_tracking_vars = new Array("category","action","label");
    var campaign_tracking_vars = new Array();
    var tracking_domain = txt_tracking_server;

    function setTrackingString(){
        if(camp_vars){
          for ( var i=0;i<camp_vars.length;camp_vars++ ) {
              var current_var_value = CookieManager.get(camp_vars[i]);
              if(current_var_value){
                  campaign_tracking_vars.push(camp_vars[i] + "=" + current_var_value);
              }
          }
        }
    };

    this.trackEvent = function(eventName){
        if("https:" == document.location.protocol){
            var tracking_string = "https://" + document.location.host + "/softslate/images/store/event.gif?";
        }else{
            var tracking_string = "http://" + tracking_domain + "/icons/event.gif?";
        }

        var event_params = eventName.split("/");

        if(event_params.length > 0){
            for (var i in event_params){
                if(event_params.hasOwnProperty(i)){
                    event_tracking_vars[i] = event_tracking_vars[i] + "=" + escape(event_params[i]);
                }
            }
        }

        if(event_tracking_vars.length > 0){
            tracking_string = tracking_string + event_tracking_vars.join("&") + "&";
        }

        if(campaign_tracking_vars.length > 0){
            tracking_string = tracking_string + tracking_string_vars.join("&");
        }
        var track_im = new Image(1,1);
        track_im.src=tracking_string;
    };

    this.trackPage = function(pageName){
        var now = new Date();
        var img_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");
            if("https:" == document.location.protocol){
                var tracking_string = "https://" + document.location.host + "/softslate/images/store/page.gif?";
            }else{
                var tracking_string = "http://" + tracking_domain + "/icons/page.gif?";
            }
            tracking_string = tracking_string + "pageName=" + escape(pageName) + "&d=" + now.getTime() + "&";

        if(campaign_tracking_vars.length > 0){
            tracking_string = tracking_string + campaign_tracking_vars.join("&");
        }

        var track_im = new Image(1,1);
        track_im.src=tracking_string;

    };

    this.addItem = function(item, sku, name, category, price, quantity){
        var now = new Date();
        if("https:" == document.location.protocol){
            var tracking_string = "https://" + document.location.host + "/softslate/images/store/item.gif?";
        }else{
            var tracking_string = "http://" + tracking_domain + "/icons/item.gif?";
        }
        tracking_string = tracking_string + "item=" + escape(item) + "&sku=" + escape(sku) + "&name=" + escape(name) + "&category=" + escape(category) + "&price=" + escape(price) + "&quantity=" + escape(quantity) + "&d=" + now.getTime();

        var track_im = new Image(1,1);
        track_im.src=tracking_string;
    };

    this.addTrans = function(orderId, affiliation, total , tax, shipping, city, state, country){
        var now = new Date();
        if("https:" == document.location.protocol){
            var tracking_string = "https://" + document.location.host + "/softslate/images/store/transaction.gif?";
        }else{
            var tracking_string = "http://" + tracking_domain + "/icons/transaction.gif?";
        }
        tracking_string = tracking_string + "orderId=" + escape(orderId) + "&affiliation=" + escape(affiliation) + "&total=" + escape(total) + "&tax=" + escape(tax) + "&shipping=" + escape(shipping) + "&city=" + escape(city) + "&state=" + escape(state) + "&country=" + escape(country) + "&d=" + now.getTime();

        var track_im = new Image(1,1);
        track_im.src=tracking_string;
    };

    setTrackingString();
};


/*###############Copyright##################
 *####   Copyright 2009 Texterity, Inc  ####
 *###############Copyright##################
 */
